2015-02-04 3 views
4

Я использую Yahoo Social API для Contacts с помощью oauth2 через Javascript (как указано здесь https://developer.yahoo.com/oauth2/guide/#implicit-grant-flow-for-client-side-apps)Yahoo - OAuth2 - SocialAPI: Не возвращаются "Access-Control-Allow-Origin" в первоначальном ответе

Однако после 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. 

Однако, когда я пытаюсь Curl в PHP с тем же вызовом, она работает (и, следовательно, доказывает, что это не проблема с маркером).

Кто-нибудь знает, как это решить? Спасибо.

+0

Я пробовал много для решения, а затем сдался и использовал Curl через PHP вместо этого. Но я бы хотел, чтобы было решение, так как у кого-то еще может быть эта проблема ... –

+1

Да, я столкнулся с той же проблемой , Думаю, я мог бы проксировать его через Nginx. – newtonapple

ответ

4

Таким образом, проблема связана с API https://social.yahooapis.com/, а не с вашим кодом, однако есть способы обойти его.

Кто-то должен связаться с Yahoo Social API Разработчики и сказать им, чтобы осуществить следующее решение:

Скажем, например, ваш маркер доступа aouth2 является «XXXXXXXX» и вы делаете следующий запрос, чтобы получить идентификатор пользователя из вашей JavaScript код.

$.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); 
        } 
     }); 

Перед отправкой на самом деле этот запрос 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 

, а также Yahoo 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 

Несмотря на то, réponse возвращается с 200OK статусом он отсутствует следующий заголовок ответа :

Access-Control-Allow-Origin:* 

Хром и другие современные веб-браузеры имеют безопасность что если вы делаете запрос GET CORS и ответ не имеет заголовка Access-Control-Allow-Origin, тогда в журналах будет отображаться следующее сообщение: REGARDLESS - то, что фактически возвращается социальным.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. 

Так что вы на самом деле получить обратно:

{ 
    "guid" : 
    { 
    "uri": "XXXX", // URI value 
    "value": "XXXX" 
    } 
} 

Однако из ваших браузеров особенности безопасности показывает:

No 'Access-Control-Allow-Origin' header is present on the requested resource. 

он отлично работает для р eople, которые используют YDN SDK (не браузерные способы доступа к API), реализация на стороне сервера и старый веб-браузер. Однако не работает для новых современных браузеров. Который также объясняет непоследовательный пользовательский опыт работы с некоторыми людьми, но не с другими людьми в этом форуме. https://developer.yahoo.com/forum/OAuth-General-Discussion-YDN-SDKs/http-social-yahooapis-com-Will-be-right-back/1395509802423-89faffa2-1503-486d-bc29-6505719bd774/

Единственный способ использовать это прямо сейчас - сделать запрос GET HTTP с вашего кода сервера, а не на javascript клиента код. И поскольку ваш сервер не имеет функций безопасности, он получит фактический результат.

Однако, чтобы исправить проблему, разработчики Yahoo добавили Access-Control-Allow-Origin: * , чтобы разрешить клиентские запросы javascript к их api.

Я написал это, потому что знаю, что многие люди будут идти по тому же вопросу. Если это было полезно для вас, и проблема все еще не была исправлена, обратитесь к разработчикам Yahoo и попросите их реализовать это решение.