46

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

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

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

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

4

5 に答える 5

23

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

于 2016-06-18T11:10:41.883 に答える
3

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

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

于 2016-01-07T06:31:52.240 に答える
2

これはリスナーで実現できます。

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();
}
于 2016-06-01T23:41:50.883 に答える
0

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

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

基本的にrefresh token、認証を要求したときに最初に取得します。将来の使用のために、そのトークンを安全に保存する必要があります。(access tokenIDトークンとして言及した)は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();
}

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

于 2015-08-26T14:51:26.490 に答える