Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set tenant to header in mediator with WSO2 API Manager

I have an API that requires the tenant as a header.

If I create a custom in-sequence:

<sequence name="WSO2AM--Ext--In">
    <header
       name="X-Tenant-Id"
       scope="transport"
       action="set"
       expression="???????????????????"
    />
</sequence>

Is there an expression that I can use to achieve this? Or should I resort to creating a per-API mediator to set it?

PS: Looking at WSO2 source code (CarbonTenantInfoConfigurator.java), I found this fragment that could be useful as a hint:

PrivilegedCarbonContext cc = PrivilegedCarbonContext.getThreadLocalCarbonContext();
String tenantDomain = cc.getTenantDomain();
int tenantId = cc.getTenantId();
messageContext.setProperty("tenant.info.domain", tenantDomain);
messageContext.setProperty("tenant.info.id", tenantId);

But I don't know how to access to those properties in the custom sequence, if possible.

like image 981
Ricardo Stuven Avatar asked Aug 18 '15 15:08

Ricardo Stuven


1 Answers

After checking the debug output from ApiManager, I noticed that custom sequences are being executed right after handlers. Luckily, the OAuthAuthenticator class (used by APIAuthenticationHandler) sets some handy properties like END_USER_NAME and APPLICATION_NAME.

END_USER_NAME contains the name and tenant of the caller ([email protected]).

This custom sequence worked for me:

<sequence name="add_service_header" trace="enable" statistics="enable" xmlns="http://ws.apache.org/ns/synapse">
    <log/>
    <property name="tenant" expression="fn:substring-after(get-property('END_USER_NAME'), '@')" />
    <header name="X-Tenant" scope="transport" expression="get-property('tenant')"/>
    <header name="X-AppName" scope="transport" expression="get-property('APPLICATION_NAME')"/>
</sequence>

I could not find documentation for the property other than source code and this other question

like image 173
Marcos Sánchez Avatar answered Nov 08 '22 02:11

Marcos Sánchez