WSO2 IS Custom authenticator with property files - wso2

I am creating a custom authenticator in WSO2 IS 5.11 and I need to create some property files in server, i.e, repository/conf/myproperties.properties to load them from the custom authenticator. I always get "access denied". How can I set this property files in the server and read them properly in the custom authenticator?
Cheers

If you want to load the properties from a new properties file, add the file into the preferred location of IS and write the logic to read your file and load the properties into a data holder during the OSGi service activation.
That file reading and storing logic need to be invoked in the activate(ComponentContext ctxt) method mentioned in step 3 of
https://is.docs.wso2.com/en/latest/develop/writing-a-custom-local-authenticator/#configurations.
As an alternative option you can use the <is-home>/repository/conf/identity/application-authentication.xml file to store your custom authenticators properties. The following configs need to be applied in to
<is-home>/repository/conf/deployment.toml file.
(NOTE: <cutom_alias>, should be replaced)
[authentication.authenticator.<cutom_alias>]
name = "<CustomeAuthenticatorName>"
enable = true
[authentication.authenticator.<cutom_alias>.parameters]
param1 = "value1"
param2 = "value2"
That file reading logic already implemented and you can retrieve the params by getAuthenticatorConfig() method in AbstractApplicationAuthenticator class.getAuthenticatorConfig().getParameterMap(); can be used to load the defined parameters. (eg:
https://github.com/wso2-extensions/identity-local-auth-basicauth/blob/6b6ae8d452397f26f948a870e72e8086b46669c9/components/org.wso2.carbon.identity.application.authenticator.basicauth/src/main/java/org/wso2/carbon/identity/application/authenticator/basicauth/BasicAuthenticator.java#L203)

Related

How can I pass tenant value in the URL via Integration Studio?

I have a multi tenant API and I am trying to RESTIFY it using wso2. I am trying a way to pass the tenant value in the url.
localhost:8290//tenant/api/...
https://tenant.xyz.com/api/...
I tried İntegration studio and i managed to pass a literal tenant value in http endpoint by creating a property named {uri.var.tenant} and setting it to tenant name. However, I don't know how can I take the tenant name from here
localhost:8290//tenant/api
and pass it here.
https://tenant.xyz.com/api/
I also tried using the APIM publisher page with no success.
As I see, there are 2 parts for your question.
How to parameterize the backend URL.
How to read the path parameter from the fronting API that is being called.
For the first one, the method you have followed is correct and an example can be found at https://apim.docs.wso2.com/en/latest/integrate/examples/endpoint_examples/using-http-endpoints/#example-1-populating-an-http-endpoint-during-mediation . What's remaining is to read the path parameter and to populating {uri.var.tenant} which is the second point.
For the second point, you can create and API definition with the URL templated. See the property URI Template at https://apim.docs.wso2.com/en/latest/reference/synapse-properties/rest-api-properties/ you can find an example of the usage at https://apim.docs.wso2.com/en/latest/integrate/examples/rest_api_examples/setting-query-params-outgoing-messages/#reading-a-query-or-path-parameter

How to read data from properties file in wso2 esb

I created one file test.properties in the //wso2esb-4.9.0/repository/conf folder.
In this test.properties files I created on properties given below
testData=welcome
Now, I want to read that testData value in the proxy files in WSO2.
Here is a proxy code to get the value:
<property name="irisprop" expression="get-property('registry','conf:/iris.properties#tokenvalue')" scope="default"/>
The get-property('registry','') will fetch the values stored in the registry 1. You can refer to the documentation on 2, [3] to further clarification regarding the registry. You can use the carbon console to browse and add the registry resources.
You will not be able to read a file content directly with the property mediator. But if your use case is to use the file system to store data, you will need to use the VFS transport or the file connector. Please refer to the documentation [4], [5] to further clarify this.
1-https://docs.wso2.com/display/EI6xx/Property+Mediator#PropertyMediator-Example4:ReadingafilestoredintheRegistry
2-https://docs.wso2.com/display/ESB490/Working+with+the+Registry
[3]-https://docs.wso2.com/display/ESB490/Managing+Registry+Content
[4]-https://docs.wso2.com/display/EI6xx/VFS+Transport
[5]-https://docs.wso2.com/display/ESBCONNECTORS/File+Connector

API Gateway Custom Domain - having both empty base path mapping to stages and a static html page on the empty base path

I have an AWS API Gateway set up with a custom domain name one the format api.example.com. I have a api.example.com/prod stage and a api.example.com/dev stage, but I would also like to be able to modify the response returned on api.example.com.
What I want is very similar to how the GitHub api behaves. Where https://api.github.com/v2 access version 2 of the api, and https://api.github.com/v3 access version 3, but https://api.github.com gives a custom response.
In my case I would like to have a small static html page on api.example.com, but a custom json response (like on api.github.com) is fine, anything more helpful than {"message":"Forbidden"} would do.
I know I set up base path mappings to the dev and prod stages in the custom domain window (as my partially redacted settings below), but I would like to add a empty path as well, and have that point to another API with just a GET method on the root resource that returns a small static html page. API Gateway does not allow combining an empty base path mapping with non-empty base path mappings (for a good reason I assume), but it feel there should be some way to achieve what I am trying to set up.
Anyone who knows a way to achieve this using AWS API Gateway?

Jaggery (WS02) endpoint reference/dynamic endpoint

I'm currently developing an application in Jaggery which I deploy on their API manager.
From the Jaggery back end I'm calling a SOAP webservice using the method documented here, which specifies:
<%
var url = 'http://jaggeryjs.org/apidocs/resources/home.jag';
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.setRequestHeader("user" , "madhuka");
xhr.send();
print("ReadyState : "+xhr.readyState);
print("<br>ResponseStatus : "+xhr.status);
print("<br>ResponseText : "+xhr.responseText);
%>
I have everything up and working fine, however I'd like to remove the hard-coded URL and replace it with some sort of URL lookup, based on environment.
What is the correct way of doing this? Can I specify an endpoint in API manager and refer to it? Or perhaps use an EPR file. I've had little luck with the Jaggery documentation in this sense.
I have seen many jaggery apps developed for WSO2 products. The practice followed in them is to have a config file in json format. You can have a method to read it and get necessary values by passing the attribute name.
You can either have a config file for each environment and pack the correct one with the app or have a single config file with endpoints for each environment. If you are going to maintain a single config file, you have to dynamically construct the attribute name and read its value. To do that also, you need to maintain which environment it is. Therefore I recommend to use a config file for each environment and bundle the correct file for the environment.

SOAP UI project request object

I am working with SOAP UI project to test web service.
When i build a request automatically using SOAP UI right click and generate rquest.
Request is generated with default '?' value with all the properties requires for request.
My request object contains bunch of properties nearly i can say 100-150. I have to set this manually.
My question is that is there any way to generate request object with default values?
Yes, use a Request Template.
Under the Interface, find your method.
Right click on the method, select New Request, give it a name, click OK.
Define your default values. Close the Request editor.
Right-click on the Request you named in step 2, select Add To test Case. Follow through with the rest of the prompts.