当前正在使用WSO2 API Manager版本2.2.0。 OAuth 2.0的实现非常好。
当我们通过WSO2 API商店定义新的应用程序时,我们能够生成使用者密钥和机密信息,并选择“授予类型”来生成访问令牌。之后,我们应该使用一些订阅层订阅API。
然后在API调用期间授权访问令牌(也称为API密钥)。访问令牌链接到属性,然后将这些属性放入AuthenticationContext
中,例如org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.java
中的以下摘录:
APIKeyValidationInfoDTO info;
info = keyValidator.getKeyValidationInfo(apiContext, apiKey, apiVersion, authenticationScheme, clientDomain,
matchingResource, httpMethod, defaultVersionInvoked);
if (info.isAuthorized()) {
AuthenticationContext authContext = new AuthenticationContext();
authContext.setAuthenticated(true);
authContext.setTier(info.getTier());
authContext.setApiKey(apiKey);
authContext.setKeyType(info.getType());
authContext.setUsername(info.getEndUserName());
authContext.setCallerToken(info.getEndUserToken());
authContext.setApplicationId(info.getApplicationId());
authContext.setApplicationName(info.getApplicationName());
authContext.setApplicationTier(info.getApplicationTier());
authContext.setSubscriber(info.getSubscriber());
authContext.setConsumerKey(info.getConsumerKey());
APISecurityUtils.setAuthenticationContext(synCtx, authContext, securityContextHeader);
这工作得很好,但是现在,我想拥有自己的自定义身份验证处理程序,该处理程序不基于访问令牌,而是基于X.509证书,其中CN将是我对身份的识别(Writing Custom Handlers )。
而且,我想受益于应用程序设置和订阅层,以便为使用X.509证书调用API的不同实体管理此类属性。使用上面提到的呼叫无法正常工作,因为我没有任何apiKey
。
我正在尝试找到一种方法,该方法如何从X.509证书而不是访问令牌中获取带有标识的应用程序API数据,以设置订阅层和其他AuthenticationContext
属性。
有什么建议可以做到吗?
答案 0 :(得分:0)
除非没有请求本身发送的信息,否则没有令牌就无法找到订阅或应用程序的详细信息。没有令牌,您只能知道API是什么,但不知道应用程序是什么。
答案 1 :(得分:0)
这些属性是必需的,因为它们用于在节流处理程序中对应用程序和订阅级别进行节流。 您可以做的是在证书中设置一些属性,例如commonNameAtribute(CN)作为应用程序名称,将客户端ip(从messageContext获取)作为应用程序ID。因此,应用程序级别限制将起作用,而无需在商店中创建应用程序。将应用程序层设置为商店中任何可用的可用应用程序层之一。 将使用者密钥设置为null,并将订户也设置为commonNameAtribute。 并且您可以重写DefaultKeyValidationHandler以便跳过订阅验证。可以在api-manager.xml中配置此类。