Googleログインを使用しています。ユーザーが私のサイトにアクセスしてgapi.auth2.getAuthInstance().signIn()
でログインするか、すでにログインしていて、ページが読み込まれる(または再読み込みされる)と、ステータスが取得されます。この時点で、サーバーで検証できる1時間有効なIDトークンを取得しました。
ユーザーがブラウザーをそのまま(たとえば、夜間)放置すると、このトークンは期限切れになります。 gapi.auth2.getAuthInstance().isSignedIn.get()
はtrueを返しますが、トークンは検証されません。
ユーザーがログインして、セッションがアクティブな間(つまり、ブラウザーが閉じられていない間)にログインしたままにするにはどうすればよいですかまたはトークンを更新しますか?ページをリロードするよりも優雅なもの...
編集:更新トークンは正しい答えではありません。オフラインでアクセスしたくない(許可を求めたくない)。 Googleは明らかに、ユーザーがまだ私のアプリケーションにログインしていると考えています。ユーザーは、ページをリロードして、資格情報を再度提供しなくても新しいトークンを取得できます。更新されたトークンを取得するための隠しiframeよりも優雅なメカニズムは確かにありますか?
トークンの有効期限が切れている場合は、gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()
を呼び出すことができます。それは約束を返します。
FWIW、私たちは(主に) リスナーアプローチ を介してそれを機能させることができました。アクセストークンの有効期限が切れる約5分前に、「userChanged」コールバックが呼び出されるようです。ページを更新せずにアクセストークンを抽出して更新するには、これで十分です。
しかし、うまくいかないのは、コンピューターがスリープ状態から戻ったときです。これは ウェイクアップ時にページをリロードする で比較的簡単に解決できます。
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();
}
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 を確認してください。