目前正在使用WSO2 API Manager 2.2.0版 . OAuth 2.0的实现非常好 .
当我们通过WSO2 API Store定义新的Application时,我们能够生成Consumer Key和Secret,并选择Grant Type来生成Access Token . 之后我们应该订阅带有一些Subscription Tier的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将是我的enitity标识(Writing Custom Handlers) .
此外,我希望获得应用程序设置和订阅层的好处,以便为使用X.509证书调用API的不同实体管理此类属性 . 使用上面提到的调用它不起作用,因为我没有任何 apiKey
.
我正在尝试找到一种方法,如何从X.509证书而不是访问令牌获取带有标识的应用程序API数据,以设置订阅层和其他 AuthenticationContext
属性 .
有什么建议可以吗?
2 回答
除非您使用请求本身发送该信息,否则无法在没有令牌的情况下找到订阅或应用程序详细信息 . 如果没有令牌,您只能知道API是什么,但您不知道该应用是什么 .
这些属性是必需的,因为它们用于节流处理程序中的应用程序和订阅级别限制 . 你可以做的是在证书中设置一些属性,如commonNameAtribute(CN)作为应用程序名称,客户端ip(从messageContext获取)作为应用程序ID . 因此,应用程序级别限制将起作用,而无需在存储中创建应用程序 . 将应用程序层设置为商店中任何一个可用的可用应用程序层 . 将使用者密钥设置为null,将subscriber也设置为commonNameAtribute . 您可以覆盖DefaultKeyValidationHandler以跳过订阅验证 . 可以在api-manager.xml中配置此类