web-dev-qa-db-ja.com

期限切れのGoogleログインログインを更新するにはどうすればよいですか?

Googleログインを使用しています。ユーザーが私のサイトにアクセスしてgapi.auth2.getAuthInstance().signIn()でログインするか、すでにログインしていて、ページが読み込まれる(または再読み込みされる)と、ステータスが取得されます。この時点で、サーバーで検証できる1時間有効なIDトークンを取得しました。

ユーザーがブラウザーをそのまま(たとえば、夜間)放置すると、このトークンは期限切れになります。 gapi.auth2.getAuthInstance().isSignedIn.get()はtrueを返しますが、トークンは検証されません。

ユーザーがログインして、セッションがアクティブな間(つまり、ブラウザーが閉じられていない間)にログインしたままにするにはどうすればよいですかまたはトークンを更新しますか?ページをリロードするよりも優雅なもの...

編集:更新トークンは正しい答えではありません。オフラインでアクセスしたくない(許可を求めたくない)。 Googleは明らかに、ユーザーがまだ私のアプリケーションにログインしていると考えています。ユーザーは、ページをリロードして、資格情報を再度提供しなくても新しいトークンを取得できます。更新されたトークンを取得するための隠しiframeよりも優雅なメカニズムは確かにありますか?

34
stickfigure

トークンの有効期限が切れている場合は、gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()を呼び出すことができます。それは約束を返します。

14
Jacek Kopecký

FWIW、私たちは(主に) リスナーアプローチ を介してそれを機能させることができました。アクセストークンの有効期限が切れる約5分前に、「userChanged」コールバックが呼び出されるようです。ページを更新せずにアクセストークンを抽出して更新するには、これで十分です。

しかし、うまくいかないのは、コンピューターがスリープ状態から戻ったときです。これは ウェイクアップ時にページをリロードする で比較的簡単に解決できます。

2
maxim

listeners でこれを実現できます。

var auth2 = gapi.auth2.getAuthInstance();

// Listen for changes to current user.
// (called shortly before expiration)
auth2.currentUser.listen(function(user){

    // use new user in your OpenID Connect flow

});

これにより、ブラウザーがアクティブである限り、現在の資格情報を保持できます。

コンピューターがスリープ状態になると、現在の資格情報を取得するために追加の作業が必要になります。

if (auth2.isSignedIn.get() == true) {
    auth2.signIn();
}
1
Waylon Flinn

Refresh Tokenを使用してオフラインアクセスを取得できます。公式リファレンスによると

アクセストークンには有効期限があります。アプリケーションが単一のアクセストークンの有効期間を超えてGoogle APIにアクセスする必要がある場合、更新トークンを取得できます。更新トークンを使用すると、アプリケーションで新しいアクセストークンを取得できます。

基本的に、最初に認証を要求するときにrefresh tokenを取得します。今後の使用のために、そのトークンを安全に保存する必要があります。 access token(IDトークンとして言及)は1時間後に有効期限が切れます。その後、新しい使用可能なrefresh tokenを取得するたびにaccess tokenを使用する必要があります。

使用しているクライアントライブラリによって、構文は異なります。以下は、phpクライアントライブラリのサンプルです。

// get access token from refresh token if access token expire

if($client->getAuth()->isAccessTokenExpired()) {
    $client->refreshToken($securelyPreservedRefreshToken);
    $newToken = $client->getAccessToken();
}

詳細な手順については this を確認してください。

0
arifin4web