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 и попросите их внедрить это решение.