0

ここで説明されているユーザー プロファイル情報を取得しようとしています: http://code.google.com/intl/es-ES/apis/accounts/docs/OAuth2Login.html

しかし、このエラーが発生しています:

「NetworkError: 405 メソッドは許可されていません - https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=token

トークンを取得するために Web サーバー アプリケーション プロトコルを使用しています。

これは私のコードです:

var xhrArgs = {

        url : "https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
        content : {
            access_token : access_token
        },
        load : function(data) {
            console.log(data);
        },
        error : function(error) {
            console.log(error);
        }
};
dojo.xhrGet(xhrArgs);

誰かが助けてくれることを願っています、前もって感謝します

4

2 に答える 2

1

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(...)
于 2012-01-19T01:31:43.993 に答える
0

認証に失敗したか、access_token で正しい情報を渡していないようです。access_token を取得する方法を示し、渡すアクセス トークンの形式 (16 桁の 16 進数など) を示すと役立つ場合があります。または 100 文字のベース 64 文字列。

また、私は道場に精通していません。この例では、リクエストの本文ではなく、get を使用して access_token を URL に追加することを示しています。道場は URL パラメータとしてコンテンツを追加しますか?

于 2011-12-05T16:57:18.510 に答える