UPDATE2:私はこの問題を再検討し、以下にリンクされているドキュメンタリーに注意深く従うことで問題を解決しました。しかし、最初に、これに苦労している人々にとって、あなたは良い仲間です。グーグルからのドキュメンタリーの非常に多くのバージョンがあり、それは混乱しています! HTMLにplatform.jsまたはclient.jsを含めていますか? gapi.authまたはgapi.auth2をロードしますか? gapi.auth2.render、gapi.auth.authorize、gapi.auth2.initなどを使用していますか。
Access_tokenを返す方法(この記事の日付現在)は以下にリンクされています。 platform.jsを使用してガイドとリファレンスに注意深く従うことで、これを機能させることができました。次に、gapi.load( 'drive'、callback)を使用してclient.jsなどの他のライブラリが動的にロードされます。
https://developers.google.com/identity/sign-in/web/listenershttps://developers.google.com/identity/sign-in/web/reference
====繁栄のための元々の問題====
UPDATE 1:googleUserオブジェクトの再帰検索を実行するようにコードサンプルを更新しました。少なくとも、これは後続のライブラリで壊れてはなりません。
以下は、Googleのgapi.auth2.AuthResponseオブジェクトのaccess_tokenがトップレベルにない問題を処理するためのコードスニペットです...オブジェクトの奥に隠されています:(!
だからそれは検索可能ですが、トップレベルではありません!! ??タイミングの問題のようです...その後のチェックでアプリケーションがしばらく実行されると、トップレベルにアクセストークンが含まれます!!
var authResponse = _.googleUser.getAuthResponse();
_.id_token = authResponse.id_token; // Always exists
// access_token should also be a param of authResponse
if (authResponse.access_token) {
debug("Worked this time?");
_.access_token = authResponse.access_token;
} else {
// !!! Internal object access !!!
debug("Attempt to get access token from base object.");
_.access_token = _.objRecursiveSearch("access_token", _.googleUser);
if (_.access_token) {
debug("Access token wasn't on authResponse but was on the base object, WTF?");
} else {
debug("Unable to retrieve access token.");
return false;
}
}
_.objRecursiveSearch = function(_for, _in) {
var r;
for (var p in _in) {
if (p === _for) {
return _in[p];
}
if (typeof _in[p] === 'object') {
if ((r = _.objRecursiveSearch(_for, _in[p])) !== null) {
return r;
}
}
}
return null;
}
GetAuthResponseは、準備ができたらコールバックを提供すると思いますが、APIのどこにあるのかわかりません。 https://developers.google.com/identity/sign-in/web/reference
この質問はかなり古いことは知っていますが、「。getAuthResponse()にaccess_tokenがありません」をグーグルで検索すると、最初に表示されます。これが、私がここにたどり着いた方法です。
2016年(そしておそらくそれ以降)の皆さんのために、これが私が見つけたものです
_.getAuthResponse
_には秘密の議論がありますが、文書化されていませんどこでも私が見つけました。アプリで以下を実行する場合
_console.log(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse);
_
次のように表示されます(コンソールからコピー/貼り付け)
関数(a){if(a)return this.hg; a = 。HE; var c =。rf(this.hg);! a.Ph || a.dL || a。 Lg ||(c.access_tokenを削除、c.scopeを削除); return c}
これは、.getAuthResponse()
関数が引数を検索し、私が知る限り、その値をチェックすることすらしないことを示しています。つまり、引数が存在するかどうかをチェックしてから、オブジェクト全体を返します。この関数がないと、残りのコードが実行され、_access_token
_とscope
の2つのキーが削除されていることがはっきりとわかります。
ここで、引数を指定して、または指定せずにこの関数を呼び出すと、出力の違いを確認できます。 (注:ブラウザーコンソールからオブジェクトをコピーして貼り付けようとすると問題が発生したため、JSON.stringifyを使用しました)。
_console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse()));
console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse(true)));
_
{"token_type": "Bearer"、 "login_hint": "_
<Huge mess of letters>
_"、 "expires_in":2112、 "id_token": "_<insert your ridiculously long string here>
_"、...}
{"token_type": "Bearer"、 "access_token": "_
<an actual access token goes here>
_"、 "scope": "_<whatever scopes you have authorized>
_"、 "login_hint": "_<another mess of letters>
_"、 "expires_in":2112 、 "id_token": "_<Insert your ridiculously long string here>
_"、...}
これが皆さんのお役に立てば幸いです。
これに対する修正を見つけました。 gapi.auth2.initでログインスコープ設定を提供しない場合、getAuthResponseでaccess_tokenを返さないことがわかります。以下に示すようにgapi.auth2.initを呼び出すと、access_tokenが表示されます。
gapi.auth2.init({
client_id: <googleClientID>,
'scope': 'https://www.googleapis.com/auth/plus.login'
})