2014-01-23 130 views
5

我們爲客戶端開發了一些API,並且我們通過API Manager發佈了它們。我們已經向客戶提供了一些關於PHP的代碼示例,它們工作正常。唯一的問題是,他們通過AJAX在與AM相關的不同域中使用這些API。這是一個跨域問題嗎?WSO2 API管理器的跨域問題

我已經嘗試設置Apache服務器與下列頭API經理的面前,讓跨域允許

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: * 

但即使有這些頭,我還在做,以撥打電話時獲得401 Unauthorizaed上午。我試圖直接將請求發送給AM,而無需通過Apache(端口8282),但我們仍然遇到同樣的問題。

回答

6

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

在無驗證類型中,「OPTIONS」動詞是否允許API使用? [1]驗證發送一個curl請求到沒有OAuth標頭的API。如果你得到一個你提到的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-Headers: authorization,Access-Control-Allow-Origin,Content-Type

如果你仍然得到錯誤,可以提供詳細的錯誤信息或樣品PHP客戶端代碼?

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

+0

我試圖創建一個新的API與資源定義GET與應用程序和應用程序用戶和選項與auth類型無。我試過的其他APIS,在第一時間只有GET之後,我不得不修改添加OPTIONS動詞 現在我嘗試新的API,並收到500錯誤,我認爲現在它正在使用跨域的AM,但現在它出現在端點api服務器上。 – Zeravla

+0

您現在面臨的問題是由於後端服務沒有正確支持OPTIONS請求,您可以通過直接向您的後端服務發送OPTIONS請求來驗證該請求,該請求將返回相同的500響應作爲解決方法,我們可以修改API synpase config在OPTIONS調用發生時發送迴應。我用這個解決方法更新了上述答案。 –

0

請將訪問控制允許標題值更改爲授權訪問控制允許來源內容類型並檢查。

+0

您應該刪除從值列表「訪問控制允許來源」。 –

+0

我們嘗試過,但仍然不工作... :( – Zeravla