web-dev-qa-db-fra.com

Comment actualiser les identifiants de connexion Google expirés?

J'utilise Google Sign-In. Un utilisateur vient sur mon site et se connecte avec gapi.auth2.getAuthInstance().signIn(), ou il est déjà connecté et lorsque la page se charge (ou se recharge), nous récupérons l'état. À ce stade, j'ai un jeton d'identité valable pendant une heure que je peux valider sur le serveur.

Lorsqu'un utilisateur laisse le navigateur assis (par exemple, du jour au lendemain), ce jeton expire. gapi.auth2.getAuthInstance().isSignedIn.get() renvoie true, mais le jeton ne valide pas.

Comment puis-je connecter un utilisateur et le garder connecté pendant que sa session est active (c'est-à-dire que le navigateur n'a pas été fermé)? Ou rafraîchir le jeton? Rien de plus gracieux que de recharger la page ...

Modifier: le jeton d'actualisation n'est pas une bonne réponse; Je ne veux pas d'accès hors ligne (et je ne veux pas demander la permission). Google pense évidemment que l'utilisateur est toujours connecté à mon application; l'utilisateur peut recharger la page et obtenir un nouveau jeton sans fournir à nouveau les informations d'identification. Il existe sûrement un mécanisme plus gracieux qu'un iframe caché pour obtenir un jeton mis à jour?

34
stickfigure

Si le jeton a expiré, vous pouvez appeler gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse(). Il renvoie une promesse.

14
Jacek Kopecký

FWIW, nous avons réussi à (principalement) le faire fonctionner via une approche de l'auditeur . Il semble que le rappel 'userChanged' soit invoqué ~ 5 minutes avant l'expiration du jeton d'accès. Cela nous suffit pour extraire et mettre à jour le jeton d'accès sans actualiser la page.

Ce qui ne fonctionne pas vraiment, c'est quand l'ordinateur revient du sommeil. Cela peut être résolu relativement facilement par rechargement de la page au réveil .

2
maxim

Vous pouvez accomplir cela avec écouteurs .

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

});

Cela vous permettra de conserver les informations d'identification actuelles, tant que le navigateur reste actif.

Si l'ordinateur est mis en veille, un travail supplémentaire doit être effectué pour obtenir les informations d'identification actuelles.

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

Vous pouvez utiliser Jeton d'actualisation pour obtenir un accès hors ligne. Selon la référence officielle

Les jetons d'accès ont une durée de vie limitée. Si votre application a besoin d'accéder à une API Google au-delà de la durée de vie d'un seul jeton d'accès, elle peut obtenir un jeton d'actualisation. Un jeton d'actualisation permet à votre application d'obtenir de nouveaux jetons d'accès.

Fondamentalement, vous obtiendrez le refresh token la première fois que vous demandez l'authentification. Vous devez enregistrer ce jeton en toute sécurité pour une utilisation future. Le access token (que vous avez mentionné comme jeton d'identité) expire après une heure. Après cela, vous devez utiliser le refresh token chaque fois que vous souhaitez obtenir un nouveau _ access token.

Selon la bibliothèque cliente que vous utilisez, la syntaxe sera différente. Voici un exemple de bibliothèque cliente PHP.

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

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

vérifier ce pour plus de détails sur les étapes.

0
arifin4web