web-dev-qa-db-ja.com

Google APIJSクライアントの使用中に更新トークンを取得する方法

ユーザーがGoogleAnalyticsへのアクセスを許可する必要があるアプリを実装しようとしています。私はこのチュートリアルに従っています:

https://developers.google.com/analytics/solutions/articles/hello-analytics-api

そして、他のいくつかの場所では、同じfunctionLを使用するAngularJsのコードがあります

https://Gist.github.com/jakemmarsh/580996

私の問題は、認証がかなりうまく機能するが、refresh_tokenを返さないことです。 refresh_tokenを返すことはありません。私はウェブ上で利用可能なすべての可能なことを試しました。 1.初めて、2。Prompt= forceなどを使用します。しかし、refresh_tokenを返すものは何もないようです。クライアントか何かによってその部分がスキップされていると思います。

ユーザーが初めてアクセスを許可したときにrefresh_tokenを取得して、保存できるようにする方法を知る必要があります。

12
Sambhav Sharma

設計どおりに更新トークンを返しません。あなたが言及したチュートリアルとコードは JavaScript用のGoogle APIクライアントライブラリ を使用しています。このライブラリは、承認が必要なリクエストを行うために OAuth 2.0クライアント側フロー を使用します。

として OAuth 2.0 Authorization Frameworkによると

暗黙的な許可タイプは、アクセストークンを取得するために使用され(更新トークンの発行をサポートしていません)、特定のリダイレクトURIを操作することがわかっているパブリッククライアント用に最適化されています。これらのクライアントは通常、JavaScriptなどのスクリプト言語を使用してブラウザに実装されます。

実際、認証コードフローは更新トークンを発行する唯一のフローであり、Googleは次のシナリオでこのフローをサポートします:Webサーバーアプリケーション、インストール済みアプリケーション、および制限付き入力デバイス上のアプリケーション。ただし、クライアント側(JavaScript)アプリケーションまたはサービスアカウント。 詳細はこちらから入手してください

したがって、この方法では更新トークンを取得できません。

20
Owen Cao

これが正しい方法かどうかはわかりませんが、次のコードを使用して更新トークンを取得できます。

window.gapi.client.init({
  apiKey: this.GOOGLE.API_KEY,
  clientId: this.GOOGLE.CLIENT_ID,
  discoveryDocs: DISCOVERY_DOCS,
  scope: SCOPES
}).then(()=>{
  const authInstance = window.gapi.auth2.getAuthInstance();
  authInstance.grantOfflineAccess()
   .then((res) => {
      console.log(res);
      this.data.refreshToken = res.code;
   });
});
4

TLDR;クエリパラメータをresponse_type='code'およびaccess_type='offline'に設定します。

"server" flow 認証を行うことでこれを回避しました。基本的に、ユーザーをリダイレクトすることで「暗黙の」フローと同じことを行いますが、response_typetoken-> codeから変更します(access_type=offlineも設定します) )。これにより認証コードが提供され、これを使用して、Exchange code for access token and ID tokenセクションに記載されているGoogle POSTサービスにOAuthすることができます。

0
Matt Goo