【问题标题】:WSO2 API Manager get Subscription Tier without API Key / TokenWSO2 API Manager 获得没有 API 密钥/令牌的订阅层
【发布时间】:2018-12-12 10:33:24
【问题描述】:

目前正在使用 WSO2 API Manager 版本 2.2.0。 OAuth 2.0 的实现非常好。

当我们通过 WSO2 API Store 定义一个新的应用程序时,我们可以生成 Consumer Key 和 Secret 并选择 Grant Type 来生成 Access Token。之后,我们应该使用一些订阅层订阅 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 属性。

有什么建议可以做吗?

【问题讨论】:

    标签: authentication wso2 access-token wso2-am x509


    【解决方案1】:

    如果没有令牌,您将无法找到订阅或应用程序的详细信息,除非您将这些信息与请求本身一起发送。没有token,只能知道API是什么,不知道app是什么。

    【讨论】:

    • 我可以在 X.509 证书中包含应用程序名称或 ID。那么是否有可能获得所有这些信息?我可以创建一个自定义身份验证处理程序,该处理程序将获取证书、提取应用程序名称并基于此执行某些操作。但是,获取应访问的 API 订阅层信息的接口是什么?我也可以将访问令牌包含到 X.509 证书中,但这不是一个好的解决方案,因为访问令牌不应该是公开的,任何人基本上都可以在证书中看到它......
    【解决方案2】:

    这些属性是必需的,因为它们用于限制处理程序中的应用程序和订阅级别限制。 您可以做的是在证书中设置一些属性,如 commonNameAtribute(CN) 作为应用程序名称,客户端 ip(get from messageContext) 作为应用程序 ID。因此,应用程序级别的限制将起作用,而无需在商店中创建应用程序。将应用程序层设置为商店中任何可用的应用程序层。 将使用者键设置为空,将订阅者也设置为 commonNameAtribute。 您可以覆盖 DefaultKeyValidationHandler 以跳过订阅验证。这个类可以在api-manager.xml中配置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多