2014-01-23 105 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