web-dev-qa-db-ja.com

GoogleUser.getAuthResponse()にaccess_tokenが含まれていません

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

20
Simon Hutchison

この質問はかなり古いことは知っていますが、「。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)));
_

getAuthResponse()オブジェクト

{"token_type": "Bearer"、 "login_hint": "_<Huge mess of letters>_"、 "expires_in":2112、 "id_token": "_<insert your ridiculously long string here>_"、...}

getAuthResponse(true)オブジェクト

{"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>_"、...}

これが皆さんのお役に立てば幸いです。

27
Jhecht

これに対する修正を見つけました。 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'
})
15
swapnil_mishra