如何使用OAuth保护的Web服务?

时间:2016-12-26 10:45:25

标签: oauth wso2 wso2esb

我是WSO2 esb的新手,我还在评估它。我正在尝试使用OAuth保护的Web服务。在我的序列中,我创建了一个像这个片段的中介OAuth:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="test-consume-oauth_v1" xmlns="http://ws.apache.org/ns/synapse">
    <in>
        <property expression="json-eval($.)" name="test-consume-oauth_v1 Body_received" scope="default" type="STRING" />

        <oauthService xmlns="http://ws.apache.org/ns/synapse"  password="xxx"
            remoteServiceUrl="https://myserver.com/token" username="xxx"/>
        <call>
            <endpoint key="test_OAUTH_v1"/>
        </call>

        <script language="js"><![CDATA[var srvResponse = mc.getPayloadJSON();
            mc.setProperty('srvResponse', srvResponse);]]></script>
        <log>
             <property expression="json-eval($.)" name="test-consume-oauth_v1 response "/>
        </log>
        <script language="js"><![CDATA[var log = mc.getServiceLog();

            mc.setPayloadJSON(mc.getProperty('srvResponse'));   

        ]]></script>

        <respond  />
    </in>
    <out>
        <send />
        <drop />
    </out>
</sequence>

但它仍然显示此错误:

MessageID: urn:uuid:ba554008-3b7c-4a96-875b-d04cc8fa179b, Direction: request, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = Not a valid OAuth Request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body/></soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator}

当我尝试使用cURL命令行时,它没有问题:

curl -X GET --header "Accept: application/json" --header "Authorization: Bearer 3ef47ff9ae9f0600aa279a0f77ddfdf" "https://myserver.com/ws-test" -k

总结我如何在Wso2 esb中执行与cURL命令行相同的操作?

祝你好运

2 个答案:

答案 0 :(得分:0)

我使用像

那样的中介头
<header name="Authorization" scope="transport" value="3ef47ff9ae9f0600aa27efd6565" />

<call>
       <endpoint key="test_OAUTH_v1"/>
</call>
 ....

这很好用。但问题是令牌的生命周期很短,所以我必须存储当前令牌,如果它无效,我必须要求一个新的有效令牌。我认为wso2esb做了这个过程,但我不知道如何处理。

你有什么建议吗?

答案 1 :(得分:0)

oauth mediator用于使用oauth保护不安全的后端。在您的情况下,您的后端已经被oauth保护,您需要通过提供oauth令牌来调用通过esb备份的后端。您需要使用密码授予类型动态生成oauth令牌并使用它来调用后端的位置。因此,您可以按照序列中的以下步骤来实现此目的

  1. 使用有效负载工厂介体为令牌端点创建有效负载。 有效负载到令牌端点 - “grant_type = password&amp; username = admin&amp; password = xxx”
  2.  <property name="grant_type" value="password" scope="default" type="STRING"/> 
        <property name="username" value="admin" scope="default" type="STRING"/>/> 
        <property name="password" value="xxxx" scope="default" type="STRING"/>/> 
                    
        <payloadFactory media-type="xml">
                        <format> 
                            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
                                <soapenv:Body> 
                                    <root> 
                                        <grant_type>$1</grant_type> 
                                        <username>$2</username> 
                                        <country>$3</country>                                
                                    </root> 
                                </soapenv:Body> 
                            </soapenv:Envelope> 
                        </format> 
                        <args> 
                            <arg evaluator="xml" expression="$ctx:grant_type"/> 
                            <arg evaluator="xml" expression="$ctx:username"/> 
                            <arg evaluator="xml" expression="$ctx:password"/> 
                       </args> 
        </payloadFactory>            
        <property name="messageType" value="application/x-www-form-urlencoded" scope="axis2" type="STRING"/> 
        <property name="DISABLE_CHUNKING" value="true" scope="axis2" type="STRING"/> 

    1. 使用call mediator调用令牌端点,并从响应中提取令牌并添加到授权标头
    2. 一个。

      <call> 
             <endpoint key="TokenEndpoint"/> 
       </call>

      湾 从响应中提取令牌

      ℃。 使用标头介体

      将标记设置为授权标头

      3.拨打实际的后端