Cross-Origin Resource Sharing (CORS) プロトコルに直面しました。Mozilla には CORS の紹介があります。クロスオリジン XHR を作成しています。呼び出しを成功させるには、小さな変更を加えるか、独自のサーバーを介してリクエストをプロキシすることで回避する必要があります。
とはいえ、Google のまだ「実験的な」サービスにはエラーがあると思います。修正されるまで、これを機能させることはできません。さらに、IE9 以前は CORS をサポートしていません。IE10 はそうする予定です。
サーバーで許可されていない HTTP メソッドは OPTIONS メソッドです。ねえ何?HTTP GET を指定しましたね。はい、そうしました。ただし、CORS プロトコルでは、特定の条件下で、ブラウザがリクエストを「プリフライト」する必要があります。プリフライトするために、ブラウザは OPTIONS リクエストを URL に送信し、サーバーが GET リクエストの作成を許可するかどうかを確認します。この場合、dojo.xhrGet 呼び出しは背後で、「X-Requested-With: XMLHTTPRequest」ヘッダーをリクエストに追加しています。X-Requested-With のような非標準ヘッダーの送信は、プリフライトをトリガーする「特定の条件」の 1 つです。
幸いなことに、追加することでそのヘッダーを抑制することができます
headers:{'X-Requested-With': null},
xhrArgs パラメータに。
その後、有効な CORS リクエストを送信します。ただし、今日の私の経験では、Google は CORS リクエストを適切に受け入れていません。「Web アプリケーションのクライアント ID」の下にある「API アクセス」タブの Google の API コンソールの設定の 1 つは、「JavaScript オリジン」です。ここでは、これらのクロスオリジン要求のいずれかを行う Web ページのオリジン (例: https://example.com )をリストします。Chrome からのエラー レポートは次のとおりです。
XMLHttpRequest cannot load https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token={elided}.
Origin https://example.com is not allowed by Access-Control-Allow-Origin.
Google の応答ヘッダーを調べると、Access-Control-Allow-Origin がまったく送信されていないことがわかります。
私の場合、数時間前にアプリを作成したばかりなので、Google はまだ「許可されたオリジン」情報をシステムに伝達していない可能性があります。おそらく、この呼び出しは明日機能します。または、この実験的機能の単なるバグです。
回避策: nginx サーバーに Google へのリクエストをプロキシさせるだけです。
location /userinfo {
proxy_pass https://www.googleapis.com/oauth2/v1/userinfo;
proxy_redirect default;
}
次に、xhrGet を「/userinfo」に送信すると、すべてが完全に機能します。
dojo.xhrGet({
url: '/userinfo',
handleAs: 'json',
headers:{'X-Requested-With': null}, //superfluous now
content: {alt: 'json', access_token: params.access_token}
}).then(...)