簡體   English   中英

WSO2 API Manager的跨域問題

[英]Cross domain problems with WSO2 API Manager

我們已經為客戶開發了一些API,我們已經通過API Manager發布了它們。 我們已經為客戶端提供了一些關於PHP的代碼示例,它們運行良好。 唯一的問題是他們在與AM關聯的域中通過AJAX使用這些API。 這是跨域問題嗎?

我嘗試使用以下標頭在API Manager前面設置apache服務器,以便允許跨域

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Authorization, Content-Type, Accept
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Origin: * 

但即使使用這些標題,我仍然可以在撥打AM時獲得401 Unknownizaed。 我已經嘗試直接向AM發出請求而不通過Apache(端口8282),但我們仍然遇到同樣的問題。

是的,這是一個跨域問題。 我建議你試試下面的內容。

您的API是否允許在“無認證類型”中使用“OPTIONS”動詞? [1]驗證是否向帶有OAuth標頭的API發送curl請求。 如果您使用CORS標題獲得200 OK響應,那么您應該沒問題。 例如:

curl -v -X OPTIONS http://localhost:8280/testapi

如果它沒有返回成功消息,那么您的后端可能不支持OPTIONS方法。 您可以通過直接向后端服務發送OPTIONS請求來驗證這一點。 您可以在后端服務中啟用OPTIONS,或通過修改API突觸配置來避免OPTIONS調用到達后端。

例如: -

<api name="admin--TestAPI" context="/test" version="1.0" version-type="url">
        <resource methods="POST GET OPTIONS DELETE PUT" url-mapping="/*">
            <inSequence>
                <filter source="get-property('axis2', 'HTTP_METHOD')" regex="OPTIONS">
                    <then>
                        <log level="custom">
                            <property name="Message" value="Received OPTIONS call, sending back headers"/>
                        </log>
                        <property name="Access-Control-Request-Headers" value="authorization,content-type" scope="transport"/>
                        <property name="Access-Control-Allow-Headers" value="authorization,Access-Control-Allow-Origin,Content-Type" scope="transport"/>
                        <property name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" scope="transport"/>
                        <property name="Access-Control-Allow-Origin" value="*" scope="transport"/>
                        <property name="RESPONSE" value="true" scope="default" type="STRING"/>
                        <header name="To" action="remove"/>
                        <send/>
                    </then>
                    <else>
                        <property name="POST_TO_URI" value="true" scope="axis2"/>
                        <filter source="$ctx:AM_KEY_TYPE" regex="PRODUCTION">
                            <then>
                                <send>
                                    <endpoint name="admin--StudentAPI_APIEndpoint_0">
                                        <address uri="http://localhost:8080/sample/1.0/one/">
                                            <timeout>
                                                <duration>30000</duration>
                                                <responseAction>fault</responseAction>
                                            </timeout>
                                            <suspendOnFailure>
                                                <errorCodes>-1</errorCodes>
                                                <initialDuration>0</initialDuration>
                                                <progressionFactor>1.0</progressionFactor>
                                                <maximumDuration>0</maximumDuration>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <errorCodes>-1</errorCodes>
                                            </markForSuspension>
                                        </address>
                                    </endpoint>
                                </send>
                            </then>
                            <else>
                                <sequence key="_sandbox_key_error_"/>
                            </else>
                        </filter>
                    </else>
                </filter>
            </inSequence>
            <outSequence>
                <send/>
            </outSequence>
        </resource>
        <handlers>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler"/>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.throttling.APIThrottleHandler">
                <property name="id" value="A"/>
                <property name="policyKey" value="gov:/apimgt/applicationdata/tiers.xml"/>
            </handler>
            <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageHandler"/>
            <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtGoogleAnalyticsTrackingHandler"/>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler"/>
        </handlers>
    </api>

然后將Access-Control-Allow-Origin添加到Access-Control-Allow-Headers列表中,並保持其他標題不變。

例如: Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type

如果仍然出現錯誤,是否可以提供詳細的錯誤消息或示例PHP客戶端代碼?

[1] http://docs.wso2.org/display/AM160/Adding+Documentation+Using+Swagger

請將Access-Control-Allow-Headers值更改為授權,Access-Control-Allow-Origin,Content-Type和check。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM