【问题标题】:To access Published WSO2 API Manager APIs using tokens from WSO2 ESB, Unable to get the access token from WSO2 API Manager要使用来自 WSO2 ESB 的令牌访问已发布的 WSO2 API Manager API,无法从 WSO2 API Manager 获取访问令牌
【发布时间】:2019-10-18 15:39:41
【问题描述】:

我编写了 WSo2 ESB 代理服务,其中代理服务调用在 WSo2 API 管理器中发布的 http 服务。因为 API 在 WSo2 API Manager 中发布以访问 API,我们需要使用使用者密钥和秘密密钥生成令牌。我手动登录到 wso2 api 管理器,订阅了已发布的 API,并使用我的使用者密钥和秘密密钥生成了令牌并在从 WSo2 ESB 调用 API 时使用该令牌。在 http 请求标头中,我设置了这些令牌,并且 WSo2 ESB 能够调用 API 从 API 获取响应,但是这个令牌将在 60 分钟后过期,所以我需要通过调用生成令牌

https://api-dev.xyz.org/token
POST 
Authorization: Basic Zzc5enNRN0xLM0hOcHU2N0g2a2R1dkx6WGRrYTpJSEF1NWZUdW5FdG9BV0xfa1hCcUdvRGVPWmdh

Payload
grant_type=client_credentials

我会得到回应

response

{
   scope: "default"
   token_type: "bearer"
   expires_in: 3171
   access_token: "db995950f960b4c67162e2d92a1117a5"
}

获取令牌的curl命令:-

curl -k -d "grant_type=client_credentials" -H "Authorization: Basic Rnl5YmwwNVhacGhBb01mVE5VNE91ZkxfblRVYTpUSmt6QUJFbzZaN3FkNkE1cHE3V3JSd2ZNaHNh, Content-Type: application/x-www-form-urlencoded" https://api-dev.xyz.org:8243/token

在 WSo2 ESB 代理服务中,我编写了类似于 curl 命令的代码来获取令牌,

<property xmlns:ns="http://org.apache.synapse/xsd"  

           name="Authorization"  

           expression="fn:concat('Basic ',OUU0Zk05eU81R0VCcV9odUxBYW15SzRCaEZFYToxVmVnbHl5OFBhQTkyMFRxbEUySnduWHlTbThh)"  

           scope="transport"/>         

         <payloadFactory media-type="json">

<format>

{

"grant_type":"client_credentials"

}

</format>

</payloadFactory>

<property name="messageType" value="application/x-www-form-urlencoded" scope="axis2"/>

          <send>

            <endpoint>
<http method="get" uri-template="https://api-dev.xyz.org:8243/token"/>

           <property name="grant_type" value="client_credentials"/>

        </endpoint>

     </send>

我得到了回应

TargetHandler I/O error: Host name verification failed for host : 172.18.65.251
javax.net.ssl.SSLException: Host name verification failed for host : 172.18.65.251
    at org.apache.synapse.transport.http.conn.ClientSSLSetupHandler.verify(ClientSSLSetupHandler.java:162)
    at org.apache.http.nio.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:291)
    at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:391)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:119)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:159)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:338)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:316)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:277)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:105)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:586)
    at java.lang.Thread.run(Thread.java:745)

知道如何解决这个问题吗?

【问题讨论】:

    标签: api wso2 esb


    【解决方案1】:

    这是一个证书验证问题。当服务器找不到主机的相应证书时,就会发生这种情况。 您可以尝试以下方法之一来解决此问题:

    1. 将后端的公共证书(本例中为 APIM)导入 ESB 的客户端信任库。有关此here 的更多信息。对于生产用途,这是推荐的方法。
    2. 否则,在“/reposotory/conf/axis2/axis2.xml”的 https 传输发送方配置中将“HostnameVerifier”值设置为“AllowAll”

    例如:

    <transportSender name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLSender">
        ....
        <parameter name="HostnameVerifier">AllowAll</parameter>
        ....
    </transportSender>
    

    【讨论】:

    • 感谢 Rajeev,我现在能够从 ESB 接收 API 令牌,当我首先尝试对 API 进行 http 服务调用时,我正在调用以获取令牌 @987654322 @ 并且我在调用 API 时在 http 标头中使用此令牌作为 Authorization : Bearer。而不是这个,当令牌过期时,我们调用 getToken 或者以任何方式检查类似 ((currentTime - timestampSkew) > (issuedTime + validationPeriod) 如果它是真的然后调用 getAccess token ,请帮忙跨度>
    猜你喜欢
    • 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
    相关资源
    最近更新 更多