在WSO2 APIM中如何为外部/第三方API处理外部身份验证

时间:2019-05-02 15:07:24

标签: wso2 wso2is wso2-am wso2carbon

我正在使用WSO2 APIM(2.5.0)和IS(5.6.0)。它们都集成并且运行良好。

现在,如果我使用API​​管理中的第三方API并使用oauth令牌,则可以访问它。但是问题是如何处理具有自己身份验证的任何外部或第三方API。

基本上,使用WSO2 APIM令牌,我可以访问要使用的内置API,但由于内置API具有自己的身份验证(基本或oauth),我们将无法获得任何响应。

如何在APIM中实现这一目标。

任何帮助或指导都会有所帮助。

编辑: 这是我正在使用的序列(感谢Bee的指导)

<sequence xmlns="http://ws.apache.org/ns/synapse" name="backend-token-sequence">
<property name="inputmessage" expression="get-property('registry', 'gov:/Login/msg/inputmessage.json')" scope="default" type="STRING"/>

               <script language="js">
               var payload = mc.getProperty("inputmessage");  
               mc.setPayloadJSON(payload)
               </script>
               <header name="Content-Type" scope="transport" value="application/json"/>
               <property name="messageType" value="application/json" scope="axis2" type="STRING" description="messageType"/>
               <property name="temp" expression="$axis2:REST_URL_POSTFIX"/>
               <property name="REST_URL_POSTFIX" action="remove" scope="axis2"/>
               <property name="DISABLE_CHUNKING" value="true" scope="axis2" type="STRING"/>

<call blocking="true">
    <endpoint>
         <http uri-template="https://xx.com/auth/login" method="POST" />
    </endpoint>
</call>
<property name="x-access-token" scope="transport" expression="json-eval($.token)"/>
<property name="REST_URL_POSTFIX" scope="axis2" expression="$ctx:temp"/>

</sequence>

这是用于API之一的流入顺序。 我正在使用API​​M URL和GET方法调用API,并传递APIM承载令牌

谢谢

1 个答案:

答案 0 :(得分:1)

开箱即用的WSO2 APIM支持basic authdigest auth作为后端安全模式。

除此之外,您可以使用custom sequences将任何类型的安全令牌传递给后端。

对于使用OAuth的后端,您有2个选项。

(1)也在API请求中发送后端令牌(入站到APIM),然后将其转发到后端。

(2)使用自定义序列来调用外部令牌API,并为后端获取一个新令牌,然后将其转发到后端。

<property name="temp" expression="$axis2:REST_URL_POSTFIX"/>
<property name="REST_URL_POSTFIX" action="remove" scope="axis2"/>
<call blocking="true">
    <endpoint>
         <http uri-template="https://external_idp.com/token" method="GET" />
    </endpoint>
</call>
<property name="BackendAuthHeader" scope="transport" expression="json-eval($.tokenresponse.token)"/>
<property name="REST_URL_POSTFIX" scope="axis2" expression="$ctx:temp"/>

由于简单,我建议(1)

编辑:有关选项(1)的更多信息:

如果您的后端需要一个标头,而不是“授权”标头,则只需将标头与您的请求一起发送,该标头就会发送到后端。

但是,如果您的后端也希望使用“ Authorization”标头,则将导致冲突,因为您不能使用同一标头来传递2个令牌(1个代表GW,1个代表后端)。要解决该问题,您可以使用custom authorization header for gateway功能。