Yahoo - OAuth2 - SocialAPI: в первоначальном ответе не возвращается "Access-Control-Allow-Origin"

Я использую Yahoo Social API за Contacts использование OAuth2 через Javascript (как указано здесь https://developer.yahoo.com/oauth2/guide/)

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

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

Кто-нибудь знает, как это решить? Благодарю.

1 ответ

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

Кто-то должен связаться с разработчиками 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-опций, чтобы увидеть если это действительный звонок.

Вот как выглядит предварительный запрос:

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

И API Yahoo отвечает обратно

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

Несмотря на то, что Reponse возвращается со статусом 200OK, ему не хватает следующего заголовка ответа:

Access-Control-Allow-Origin:*

Chrome и другие современные веб-браузеры имеют встроенную функцию безопасности, которая заключается в том, что если вы делаете запрос GET CORS, а у ответа нет заголовка 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.

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

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

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

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

Он отлично работает для людей, которые используют 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 и попросите их внедрить это решение.

Другие вопросы по тегам