【问题标题】:WSO2 APIM - Issue about Invoke API via Sub TenantWSO2 APIM - 关于通过子租户调用 API 的问题
【发布时间】:2021-06-13 23:54:55
【问题描述】:

我在本地设置了 WSO2 APIM,并向本地发布者添加了简单的 HelloWorld API,请参阅此 link 。然后,我在 APIM 管理控制台中创建了一个子租户。我为所有租户启用了订阅可用性,请参阅此link(我确定我启用了,因为我可以在 Publisher 中看到选项)。我打开 Devportal。在租户开发者门户列表中,我选择carbon.super(以便查看由超级租户管理员创建的 HelloWorld API),然后使用我的子租户 ID 和密码登录。我创建了我的应用程序并生成了密钥和秘密。然后,我订阅了由超级租户创建的 HelloWorld API。一切看起来都很正常。

我可以获得超级租户管理员和子租户管理员的 JWT 令牌。以下是 curl 命令:

curl -k -X POST https://localhost:8243/token -d "grant_type=password&username=admin&password=admin&scope=openid" -H "Authorization: Basic N25..."

curl -k -X POST https://localhost:8243/token -d "grant_type=password&username=admin@arda.test&password=12345&scope=openid" -H "Authorization: Basic SjM..."

问题是,当我尝试使用包含超级租户管理员令牌的请求调用 API 时,我可以获得 200OK 响应,但是当我尝试使用子租户管理员的 JWT 令牌时,我收到以下错误响应:

<ams:fault xmlns:ams="http://wso2.org/apimanager/security">
    <ams:code>900900</ams:code>
    <ams:message>Unclassified Authentication Failure</ams:message>
    <ams:description>Unclassified Authentication Failure</ams:description>
</ams:fault>

当我检查日志时,我看到了:

[2021-06-03 15:42:03,323] ERROR - APIAuthenticationHandler API authentication failure due to Unclassified Authentication Failure
org.wso2.carbon.apimgt.gateway.handlers.security.APISecurityException: Unclassified Authentication Failure
        at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate_aroundBody42(APIAuthenticationHandler.java:438) ~[org.wso2.carbon.apimgt.gateway_6.7.206.jar:?]
        at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate(APIAuthenticationHandler.java:418) ~[org.wso2.carbon.apimgt.gateway_6.7.206.jar:?]
        at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest_aroundBody36(APIAuthenticationHandler.java:354) [org.wso2.carbon.apimgt.gateway_6.7.206.jar:?]
        at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest(APIAuthenticationHandler.java:325) [org.wso2.carbon.apimgt.gateway_6.7.206.jar:?]
        at org.apache.synapse.rest.API.process(API.java:373) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:95) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:73) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:99) [synapse-core_2.1.7.wso2v183.jar:2.1.7-wso2v183]
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) [axis2_1.6.1.wso2v41.jar:?]
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:367) [synapse-nhttp-transport_2.1.7.wso2v183.jar:?]
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:188) [synapse-nhttp-transport_2.1.7.wso2v183.jar:?]
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) [axis2_1.6.1.wso2v41.jar:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
        at java.lang.Thread.run(Thread.java:834) [?:?]

我使用的 curl 命令是这样的:

curl -k -X GET https://localhost:8243/hello/1.0.0 -H "Authorization: Bearer eyJ..."

有什么问题?这是一个错误还是我错过了什么?

【问题讨论】:

    标签: wso2 wso2is wso2-am wso2carbon


    【解决方案1】:

    如果您使用的是 APIM 3.2.0 的香草包(没有 wum 更新),这是正常的。当我们发布 3.2.0 版本时,使用新的多公里架构,不推荐使用跨租户订阅功能。一段时间后,它通过 wum 更新再次添加到 3.2.0。如果您订阅了 wso2,则最新的 wum 更新包具有此功能并且可以正常工作。

    此 PR(https://github.com/wso2/carbon-apimgt/pull/9793) 将该功能添加到 4.0.0 版本中。

    【讨论】:

    • 感谢您的回答。但我的问题;我们没有付费订阅,我们使用的是免费版本。唯一的解决方案是切换到 4.0.0 ??
    • 您可以尝试将上述PR中的修复应用到3.2.0版本相关的源代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多