From 0d43e7d6aa1f2689fac87a40a74b17d877513042 Mon Sep 17 00:00:00 2001 From: Vigneshan Date: Mon, 14 Nov 2022 13:48:04 +0000 Subject: [PATCH] Fix dcr and token endpoint related issues --- .../extension/api/util/APIUtil.java | 2 + .../keymgt/extension/api/DCRRequest.java | 20 ++--- .../extension/api/KeyManagerService.java | 8 +- .../extension/api/KeyManagerServiceImpl.java | 23 +++++- .../apimgt/keymgt/extension/DCRResponse.java | 22 +++--- .../apimgt/keymgt/extension/TokenRequest.java | 23 +++++- .../keymgt/extension/TokenResponse.java | 14 ++-- .../extension/service/KeyMgtServiceImpl.java | 75 ++++++++++++------- .../src/main/resources/p2.inf | 1 + .../default/api/_API_Key_Management_.xml | 46 ++++++++++++ 10 files changed, 174 insertions(+), 60 deletions(-) create mode 100644 features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/synapse-configs/default/api/_API_Key_Management_.xml diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java index 014a59b9c5..a68e8b2078 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java @@ -49,6 +49,7 @@ public class APIUtil { private static final String DEFAULT_ANALYTICS_ARTIFACT_TAG = "analytics_artifacts_management"; private static final String DEFAULT_TRANSPORT_MGT_TAG = "transport_management"; private static final String DEFAULT_ENTERPRISE_TAG= "androidforwork"; + private static final String DEFAULT_ANALYTICS_MGT_TAG= "analytics_management"; public static final String PERMISSION_PROPERTY_NAME = "name"; @@ -119,6 +120,7 @@ public class APIUtil { allowedApisTags.add(DEFAULT_APP_MGT_SUB_MGT_TAG); allowedApisTags.add(DEFAULT_ANALYTICS_ARTIFACT_TAG); allowedApisTags.add(DEFAULT_TRANSPORT_MGT_TAG); + allowedApisTags.add(DEFAULT_ANALYTICS_MGT_TAG); // In an environment only super tenant should be capable of calling this API tag if (PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId() == MultitenantConstants.SUPER_TENANT_ID) { diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/DCRRequest.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/DCRRequest.java index 36f6c4d9f7..5054e2220d 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/DCRRequest.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/DCRRequest.java @@ -28,9 +28,9 @@ import javax.xml.bind.annotation.XmlRootElement; @JsonIgnoreProperties(ignoreUnknown = true) public class DCRRequest { @XmlElement(required = true) - private String clientName; + private String applicationName; @XmlElement(required = true) - private String owner; + private String username; @XmlElement(required = true) private String grantTypes; @XmlElement @@ -40,20 +40,20 @@ public class DCRRequest { @XmlElement private boolean isSaasApp; - public String getClientName() { - return clientName; + public String getApplicationName() { + return applicationName; } - public void setClientName(String clientName) { - this.clientName = clientName; + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; } - public String getOwner() { - return owner; + public String getUsername() { + return username; } - public void setOwner(String owner) { - this.owner = owner; + public void setUsername(String username) { + this.username = username; } public String getGrantTypes() { diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerService.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerService.java index 14ca64a2e6..32f4e5112a 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerService.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerService.java @@ -20,6 +20,7 @@ package org.wso2.carbon.apimgt.keymgt.extension.api; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; +import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -38,9 +39,12 @@ public interface KeyManagerService { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Path("/token") - Response generateAccessToken(@FormParam("client_id") String clientId, + Response generateAccessToken(@HeaderParam("Authorization") String basicAuthHeader, + @FormParam("client_id") String clientId, @FormParam("client_secret") String clientSecret, @FormParam("refresh_token") String refreshToken, @FormParam("scope") String scope, - @FormParam("grant_type") String grantType); + @FormParam("grant_type") String grantType, + @FormParam("assertion") String assertion, + @FormParam("admin_access_token") String admin_access_token); } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerServiceImpl.java index 53b2c4ffca..161413b4ff 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.api/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/api/KeyManagerServiceImpl.java @@ -27,14 +27,17 @@ import org.wso2.carbon.apimgt.keymgt.extension.exception.BadRequestException; import org.wso2.carbon.apimgt.keymgt.extension.exception.KeyMgtException; import org.wso2.carbon.apimgt.keymgt.extension.service.KeyMgtService; import org.wso2.carbon.apimgt.keymgt.extension.service.KeyMgtServiceImpl; +import org.wso2.carbon.device.mgt.common.exceptions.UnAuthorizedException; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; +import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.util.Base64; public class KeyManagerServiceImpl implements KeyManagerService { @@ -46,7 +49,7 @@ public class KeyManagerServiceImpl implements KeyManagerService { public Response dynamicClientRegistration(DCRRequest dcrRequest) { try { KeyMgtService keyMgtService = new KeyMgtServiceImpl(); - DCRResponse resp = keyMgtService.dynamicClientRegistration(dcrRequest.getClientName(), dcrRequest.getOwner(), + DCRResponse resp = keyMgtService.dynamicClientRegistration(dcrRequest.getApplicationName(), dcrRequest.getUsername(), dcrRequest.getGrantTypes(), dcrRequest.getCallBackUrl(), dcrRequest.getTags(), dcrRequest.getIsSaasApp()); return Response.status(Response.Status.CREATED).entity(resp).build(); } catch (KeyMgtException e) { @@ -58,20 +61,32 @@ public class KeyManagerServiceImpl implements KeyManagerService { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Path("/token") - public Response generateAccessToken(@FormParam("client_id") String clientId, + public Response generateAccessToken(@HeaderParam("Authorization") String basicAuthHeader, + @FormParam("client_id") String clientId, @FormParam("client_secret") String clientSecret, @FormParam("refresh_token") String refreshToken, @FormParam("scope") String scope, - @FormParam("grant_type") String grantType) { + @FormParam("grant_type") String grantType, + @FormParam("assertion") String assertion, + @FormParam("admin_access_token") String admin_access_token) { try { + if (basicAuthHeader == null) { + String msg = "Invalid credentials. Make sure your API call is invoked with a Basic Authorization header."; + throw new UnAuthorizedException(msg); + } + String encodedClientCredentials = new String(Base64.getDecoder().decode(basicAuthHeader.split(" ")[1])); KeyMgtService keyMgtService = new KeyMgtServiceImpl(); TokenResponse resp = keyMgtService.generateAccessToken( - new TokenRequest(clientId, clientSecret, refreshToken, scope, grantType)); + new TokenRequest(encodedClientCredentials.split(":")[0], + encodedClientCredentials.split(":")[1], refreshToken, scope, + grantType, assertion,admin_access_token)); return Response.status(Response.Status.CREATED).entity(resp).build(); } catch (KeyMgtException e) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } catch (BadRequestException e) { return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build(); + } catch (UnAuthorizedException e) { + return Response.status(Response.Status.UNAUTHORIZED).entity(e.getMessage()).build(); } } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/DCRResponse.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/DCRResponse.java index 22dc2336a6..9d854b9ebe 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/DCRResponse.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/DCRResponse.java @@ -19,27 +19,27 @@ package org.wso2.carbon.apimgt.keymgt.extension; public class DCRResponse { - String clientId; - String clientSecret; + String client_id; + String client_secret; - public DCRResponse(String clientId, String clientSecret) { - this.clientId = clientId; - this.clientSecret = clientSecret; + public DCRResponse(String client_id, String client_secret) { + this.client_id = client_id; + this.client_secret = client_secret; } public String getClientId() { - return clientId; + return client_id; } - public void setClientId(String clientId) { - this.clientId = clientId; + public void setClientId(String client_id) { + this.client_id = client_id; } public String getClientSecret() { - return clientSecret; + return client_secret; } - public void setClientSecret(String clientSecret) { - this.clientSecret = clientSecret; + public void setClientSecret(String client_secret) { + this.client_secret = client_secret; } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenRequest.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenRequest.java index 8ab5c3da35..ae5b668cba 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenRequest.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenRequest.java @@ -24,13 +24,18 @@ public class TokenRequest { private String refreshToken; private String scope; private String grantType; + private String assertion; + private String admin_access_token; - public TokenRequest(String clientId, String clientSecret, String refreshToken, String scope, String grantType) { + public TokenRequest(String clientId, String clientSecret, String refreshToken, String scope, String grantType, + String assertion, String admin_access_token) { this.clientId = clientId; this.clientSecret = clientSecret; this.refreshToken = refreshToken; this.scope = scope; this.grantType = grantType; + this.assertion = assertion; + this.admin_access_token = admin_access_token; } public String getClientId() { @@ -72,4 +77,20 @@ public class TokenRequest { public void setRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } + + public String getAssertion() { + return assertion; + } + + public void setAssertion(String assertion) { + this.assertion = assertion; + } + + public String getAdminAccessToken() { + return admin_access_token; + } + + public void setAdminAccessToken(String admin_access_token) { + this.admin_access_token = admin_access_token; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenResponse.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenResponse.java index 8373d7f8f1..0298813878 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenResponse.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/TokenResponse.java @@ -22,14 +22,14 @@ public class TokenResponse { private String access_token; private String refresh_token; private String scope; - private String tokenType; + private String token_type; private int expires_in; - public TokenResponse(String access_token, String refresh_token, String scope, String tokenType, int expires_in) { + public TokenResponse(String access_token, String refresh_token, String scope, String token_type, int expires_in) { this.access_token = access_token; this.refresh_token = refresh_token; this.scope = scope; - this.tokenType = tokenType; + this.token_type = token_type; this.expires_in = expires_in; } @@ -57,12 +57,12 @@ public class TokenResponse { this.scope = scope; } - public String getTokenType() { - return tokenType; + public String getToken_Type() { + return token_type; } - public void setTokenType(String tokenType) { - this.tokenType = tokenType; + public void setTokenType(String token_type) { + this.token_type = token_type; } public int getExpiresIn() { diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/service/KeyMgtServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/service/KeyMgtServiceImpl.java index 23daf8dfdd..a593e04bc6 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/service/KeyMgtServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension/src/main/java/org/wso2/carbon/apimgt/keymgt/extension/service/KeyMgtServiceImpl.java @@ -20,6 +20,7 @@ package org.wso2.carbon.apimgt.keymgt.extension.service; import com.google.gson.Gson; import okhttp3.Credentials; +import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -41,7 +42,6 @@ import org.wso2.carbon.apimgt.keymgt.extension.KeyMgtConstants; import org.wso2.carbon.apimgt.keymgt.extension.OAuthApplication; import org.wso2.carbon.apimgt.keymgt.extension.TokenRequest; import org.wso2.carbon.apimgt.keymgt.extension.TokenResponse; -import org.wso2.carbon.apimgt.keymgt.extension.exception.BadRequestException; import org.wso2.carbon.apimgt.keymgt.extension.exception.KeyMgtException; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; @@ -53,9 +53,7 @@ import org.wso2.carbon.user.api.UserStoreManager; import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.utils.multitenancy.MultitenantUtils; -import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @@ -82,6 +80,17 @@ public class KeyMgtServiceImpl implements KeyMgtService { public DCRResponse dynamicClientRegistration(String clientName, String owner, String grantTypes, String callBackUrl, String[] tags, boolean isSaasApp) throws KeyMgtException { + if (owner == null) { + PrivilegedCarbonContext threadLocalCarbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + try { + owner = APIUtil.getTenantAdminUserName(threadLocalCarbonContext.getTenantDomain()); + } catch (APIManagementException e) { + String msg = "Error occurred while retrieving admin user for the tenant " + threadLocalCarbonContext.getTenantDomain(); + log.error(msg, e); + throw new KeyMgtException(msg); + } + } + String tenantDomain = MultitenantUtils.getTenantDomain(owner); int tenantId; @@ -97,10 +106,8 @@ public class KeyMgtServiceImpl implements KeyMgtService { kmConfig = getKeyManagerConfig(); if (KeyMgtConstants.SUPER_TENANT.equals(tenantDomain)) { - OAuthApplication superTenantOauthApp = createOauthApplication( - KeyMgtConstants.RESERVED_OAUTH_APP_NAME_PREFIX + KeyMgtConstants.SUPER_TENANT, - kmConfig.getAdminUsername(), tags); - return new DCRResponse(superTenantOauthApp.getClientId(), superTenantOauthApp.getClientSecret()); + OAuthApplication dcrApplication = createOauthApplication(clientName, kmConfig.getAdminUsername(), tags); + return new DCRResponse(dcrApplication.getClientId(), dcrApplication.getClientSecret()); } else { // super-tenant admin dcr and token generation OAuthApplication superTenantOauthApp = createOauthApplication( @@ -141,7 +148,7 @@ public class KeyMgtServiceImpl implements KeyMgtService { } } - public TokenResponse generateAccessToken(TokenRequest tokenRequest) throws KeyMgtException, BadRequestException { + public TokenResponse generateAccessToken(TokenRequest tokenRequest) throws KeyMgtException { try { Application application = APIUtil.getApplicationByClientId(tokenRequest.getClientId()); String tenantDomain = MultitenantUtils.getTenantDomain(application.getOwner()); @@ -167,20 +174,43 @@ public class KeyMgtServiceImpl implements KeyMgtService { } JSONObject jsonObject = new JSONObject(); - if ("client_credentials".equals(tokenRequest.getGrantType())) { - jsonObject.put("grant_type", "password"); - jsonObject.put("username", username); - jsonObject.put("password", password); - } else if ("refresh_token".equals(tokenRequest.getGrantType())) { - jsonObject.put("grant_type", "refresh_token"); - jsonObject.put("refresh_token", tokenRequest.getRefreshToken()); - } else { - msg = "Invalid grant type: " + tokenRequest.getGrantType(); - throw new BadRequestException(msg); + RequestBody appTokenPayload; + switch (tokenRequest.getGrantType()) { + case "client_credentials": + case "password": + appTokenPayload = new FormBody.Builder() + .add("grant_type", "password") + .add("username", username) + .add("password", password) + .add("scope", tokenRequest.getScope()).build(); + break; + + case "refresh_token": + appTokenPayload = new FormBody.Builder() + .add("grant_type", "refresh_token") + .add("refresh_token", tokenRequest.getRefreshToken()) + .add("scope", tokenRequest.getScope()).build(); + break; + case "urn:ietf:params:oauth:grant-type:jwt-bearer": + appTokenPayload = new FormBody.Builder() + .add("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer") + .add("assertion", tokenRequest.getAssertion()) + .add("scope", tokenRequest.getScope()).build(); + break; + case "access_token": + appTokenPayload = new FormBody.Builder() + .add("grant_type", "access_token") + .add("admin_access_token", tokenRequest.getAdminAccessToken()) + .add("scope", tokenRequest.getScope()).build(); + break; + default: + appTokenPayload = new FormBody.Builder() + .add("grant_type", tokenRequest.getGrantType()) + .add("scope", tokenRequest.getScope()).build(); + break; } jsonObject.put("scope", tokenRequest.getScope()); - RequestBody appTokenPayload = RequestBody.Companion.create(jsonObject.toString(), JSON); kmConfig = getKeyManagerConfig(); String appTokenEndpoint = kmConfig.getServerUrl() + KeyMgtConstants.OAUTH2_TOKEN_ENDPOINT; Request request = new Request.Builder() @@ -449,12 +479,7 @@ public class KeyMgtServiceImpl implements KeyMgtService { }; return new OkHttpClient.Builder() .sslSocketFactory(getSimpleTrustedSSLSocketFactory(), trustAllCerts) - .hostnameVerifier(new HostnameVerifier() { - @Override - public boolean verify(String s, SSLSession sslSession) { - return true; - } - }).build(); + .hostnameVerifier((hostname, sslSession) -> true).build(); } private static SSLSocketFactory getSimpleTrustedSSLSocketFactory() { diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/p2.inf b/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/p2.inf index 03e2e6eb95..fa1ab939b0 100644 --- a/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/p2.inf +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/p2.inf @@ -1,3 +1,4 @@ instructions.configure = \ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.apimgt.keymgt.extension_${feature.version}/webapps/api-key-management.war,target:${installFolder}/../../deployment/server/webapps/api-key-management.war,overwrite:true);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.apimgt.keymgt.extension_${feature.version}/synapse-configs/default/api/_API_Key_Management_.xml,target:${installFolder}/../../deployment/server/synapse-configs/default/api/_API_Key_Management_.xml,overwrite:true);\ diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/synapse-configs/default/api/_API_Key_Management_.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/synapse-configs/default/api/_API_Key_Management_.xml new file mode 100644 index 0000000000..0d2b983679 --- /dev/null +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.keymgt.extension.feature/src/main/resources/synapse-configs/default/api/_API_Key_Management_.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + 60000 + fault + + + + + + + + + + + + + +