Yahoo - OAuth2 - SocialAPI:在初始响应中不返回"Access-Control-Allow-Origin"

Rah*_*san 5 javascript oauth-2.0 yahoo-api yahoo-oauth

我使用Yahoo Social APIContacts通过JavaScript中使用OAuth2(这里给出https://developer.yahoo.com/oauth2/guide/#implicit-grant-flow-for-client-side-apps)

但是,经过successful authentication并纠正后Access Token,我无法通过JS完成调用.浏览器说:

XMLHttpRequest cannot load https://social.yahooapis.com/v1/user/me/contacts
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://..' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用相同的调用PHP的Curl时,它可以工作(因此证明它不是令牌的问题).

谁知道如何解决这个问题?谢谢.

Shi*_*nha 6

所以问题在于https://social.yahooapis.com/ API而不是你的代码,但是有很多方法可以解决它.

有人需要联系Yahoo Social API开发人员并告诉他们实施以下解决方案:

比如说你的aouth2访问令牌是"XXXXXXXX",你发出以下请求来从你的javascript代码中获取用户ID.

$.ajax({
         url: 'https://social.yahooapis.com/v1/me/guid?format=json',
         beforeSend: function (xhr) {
                        xhr.setRequestHeader ("authorization", "Bearer " + "XXXXXXXX");
                    },
                    success:function(guuid) {
                        console.log(guuid);
                    }
        });
Run Code Online (Sandbox Code Playgroud)

在实际将此HTTP GET请求发送到social.yahooapis.com域之前,您的浏览器会识别出这是一个CORS请求(发出与原始域不同的请求)并使用HTTP OPTIONS进行"预检检查"以查看如果这是一个有效的电话.

这是预检请求的样子:

Request Header
:host:social.yahooapis.com
:method:OPTIONS
:path:/v1/me/guid?format=json
:scheme:https
:version:HTTP/1.1
accept:*/*
accept-encoding:gzip, deflate, sdch
accept-language:en-US,en;q=0.8
access-control-request-headers:accept, authorization
access-control-request-method:GET
cache-control:no-cache
origin:http://yourorigin.io
pragma:no-cache
referer:http://yourorigin.io
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36     (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.3
Run Code Online (Sandbox Code Playgroud)

和雅虎API回应

Response Header
age:0
allow:OPTIONS,HEAD,GET
content-length:0
content-type:application/vnd.sun.wadl+xml
date:Sun, 10 May 2015 19:21:40 GMT
last-modified:Thu, 30 Apr 2015 13:20:58 PDT
server:ATS
servletwebservicefilter-enabled:true
status:200 OK
vary:Accept
version:HTTP/1.1
via:http/1.1 r18.ycpi.ne1.yahoo.net (ApacheTrafficServer [c sSf ]), https/1.1             r26.ycpi.sjb.yahoo.net (ApacheTrafficServer [c sSf ])
x-yahoo-social-data-source:default_source
x-yahoo-social-host:ws127.progrss.ne1.yahoo.com
y-rid:er2nai1akvbu4
Run Code Online (Sandbox Code Playgroud)

即使Reponse返回200OK状态,它也缺少以下响应标题:

Access-Control-Allow-Origin:*
Run Code Online (Sandbox Code Playgroud)

Chrome和其他现代Web浏览器具有内置的安全功能,如果您正在发出GET CORS请求且响应没有Header Access-Control-Allow-Origin,则日志中会显示以下消息,无论实际返回的是什么通过social.yahooapis.com

XMLHttpRequest cannot load https://social.yahooapis.com/v1/me/guid?format=json.
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://yourorigin.com' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

所以你实际得到的是:

{   
  "guid" :   
   {   
    "uri": "XXXX",  // URI value  
    "value": "XXXX"   
   }  
 } 
Run Code Online (Sandbox Code Playgroud)

但是,由于您的浏览器安全功能,它显示:

No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)

它适用于使用YDN SDK(非浏览器方式访问API),服务器端实现和旧Web浏览器的用户.然而,对于新的现代浏览器不起作用.这也解释了它为某些人而不是其他人在这个论坛中工作的不一致的用户体验https://developer.yahoo.com/forum/OAuth-General-Discussion-YDN-SDKs/http-social-yahooapis-com-将待右后卫/ 1395509802423-89faffa2-1503-486d-bc29-6505719bd774 /

现在实际使用它的唯一方法是从服务器代码而不是客户端javascript代码发出GET HTTP请求.由于您的服务器没有安全功能,因此它将收到实际结果.

但是要解决问题雅虎开发人员添加Access-Control-Allow-Origin:*以允许客户端javascript请求到他们的api.

我写这篇文章是因为我知道很多人都会遇到同样的问题.如果这对您有帮助并且问题仍未得到解决,请联系雅虎开发人员并让他们实施此解决方案.