したがって、問題はコードではなくhttps://social.yahooapis.com/ API にありますが、それを回避する方法があります。
誰かが Yahoo ソーシャル API 開発者に連絡して、次の解決策を実装するように伝える必要があります。
たとえば、auth2 アクセス トークンが「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);
}
});
この 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
AND 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
応答は 200OK ステータスで返されますが、次の応答ヘッダーがありません。
Access-Control-Allow-Origin:*
Chrome およびその他の最新の Web ブラウザーには安全機能が組み込まれており、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 にアクセスする方法)、サーバー側の実装、および古い Web ブラウザーを使用している人には問題なく動作します。ただし、新しい最新のブラウザーでは機能しません。これはまた、このフォーラムで一部の人には機能するが他の人には機能しないという一貫性のないユーザーエクスペリエンスを説明しています https://developer.yahoo.com/forum/OAuth-General-Discussion-YDN-SDKs/http-social-yahooapis-com- will-be-right-back/1395509802423-89faffa2-1503-486d-bc29-6505719bd774/
現在これを実際に使用する唯一の方法は、クライアントの JavaScript コードではなく、サーバー コードから GET HTTP リクエストを作成することです。サーバーにはセキュリティ機能がないため、実際の結果を受け取ります。
ただし、この問題を修正するには、yahoo 開発者が Access-Control-Allow-Origin:* を追加して、API へのクライアント JavaScript リクエストを許可します。
多くの人が同じ問題に直面することを知っているので、これを書きました。これが役に立ち、問題がまだ修正されていない場合は、yahoo 開発者に連絡して、この解決策を実装するよう依頼してください。