199 votes

Comment vérifier un jeton d'accès à l'API d'authentification Google ?

Comment puis-je vérifier un jeton d'accès d'authentification Google ?

J'ai besoin d'interroger Google et de demander : Le [jeton d'accès donné] est-il valable pour le compte Google [example@example.com] ?

Version courte

Il est clair qu'un jeton d'accès fourni par l'intermédiaire de l'application Google Authentication Api : : Authentification OAuth pour les applications Web peut être utilisé pour demander des données à un ensemble de services Google. La manière de vérifier si un jeton d'accès donné est valide pour un compte Google donné n'est pas claire. J'aimerais savoir comment.

Version longue

Je développe une API qui utilise l'authentification par jeton. Un jeton sera renvoyé sur présentation d'un nom d'utilisateur et d'un mot de passe valides ou sur présentation d'un jeton d'une tierce partie provenant de l'une des catégories suivantes N des services vérifiables.

L'un des services tiers sera Google, ce qui permettra à un utilisateur de s'authentifier auprès de mon service à l'aide de son compte Google. Ce service sera ensuite étendu aux comptes Yahoo, aux fournisseurs OpenID de confiance, etc.

Exemple schématique d'un accès basé sur Google :

alt text

L'entité "API" est sous mon contrôle total. L'entité "interface publique" est toute application basée sur le web ou le bureau. Certaines interfaces publiques sont sous mon contrôle, d'autres ne le seront pas et d'autres encore ne seront peut-être même jamais connues.

Je ne peux donc pas faire confiance au jeton fourni à l'API à l'étape 3. Ce jeton sera fourni avec l'adresse électronique du compte Google correspondant.

Il faut que j'interroge Google d'une manière ou d'une autre et que je demande : Ce jeton d'accès est-il valable pour example@example.com ? ?

Dans ce cas, example@example.com est l'identifiant unique du compte Google, c'est-à-dire l'adresse électronique utilisée par une personne pour se connecter à son compte Google. On ne peut pas supposer qu'il s'agit d'une adresse Gmail, car une personne peut avoir un compte Google sans avoir de compte Gmail.

La documentation de Google indique clairement comment, avec un jeton d'accès, les données peuvent être récupérées à partir d'un certain nombre de services Google. Rien ne semble indiquer comment vérifier si un jeton d'accès donné est valide en premier lieu.

Mise à jour Le jeton est valable pour tous les services Google. Je ne peux pas comparer un jeton à un service Google pour le vérifier, car je ne sais pas quel sous-ensemble de services Google un utilisateur donné utilise réellement.

En outre, je n'utiliserai jamais le jeton d'accès d'authentification de Google pour accéder aux services de Google, mais seulement pour vérifier qu'un utilisateur supposé de Google est bien celui qu'il prétend être. S'il existe un autre moyen d'y parvenir, je serai heureux d'essayer.

13voto

Vikram Rawat Points 199
  1. Selon Google la documentation Pour cela, vous devez utiliser la bibliothèque AP Client de Google, qui facilite grandement ces opérations (vérification des jetons, extraction des données, etc.) plutôt que d'écrire votre propre code personnalisé.

  2. Du point de vue des performances, le jeton doit être analysé localement sans qu'il soit nécessaire d'appeler à nouveau Google. Bien entendu, la clé publique de Google est nécessaire et la récupération de cette clé se fait à l'aide d'une stratégie de mise en cache, mise en œuvre dans la bibliothèque client de Google du point 1 ci-dessus.

  3. Pour information seulement. Google utilise également un jeton JWT. Voir l'image ci-dessous pour référence.

enter image description here

11voto

Vadzim Points 4460

Réponse de Google oauth code flow en plus de access_token renvoie également id_token qui contient des informations utiles pour la validation sous forme cryptée.

L'utilité des jetons d'identification réside notamment dans le fait que entre les différents composants de votre application. Ces composants peuvent utiliser un jeton d'identification comme un mécanisme d'authentification léger permettant d'authentifier l'application et l'utilisateur. Mais avant de pouvoir utiliser les informations contenues dans le jeton ID ou s'en servir pour affirmer que l'utilisateur s'est authentifié, vous devez le valider.

La validation d'un jeton d'identification se fait en plusieurs étapes :

  • Vérifiez que le jeton d'identification est un JWT correctement signé à l'aide d'une clé publique Google appropriée.
  • Vérifiez que la valeur de aud dans le jeton ID est égale à l'ID du client de votre application.
  • Vérifiez que la valeur de iss dans le jeton d'identification est égale à accounts.google.com ou à https://accounts.google.com .
  • Vérifiez que le délai d'expiration (exp) du jeton d'identification n'est pas dépassé.
  • Si vous avez transmis un paramètre hd dans la demande, vérifiez que le jeton d'identification a une revendication hd qui correspond à votre domaine hébergé par Google Apps.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken Le lien contient des exemples de code pour la validation des jetons d'identification.

Voir aussi https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth .

2voto

Rob Ottaway Points 457

Peut-être devriez-vous utiliser l'API OpenId de Google, et non OAuth ? OAuth permet de faire des requêtes à l'API web d'un fournisseur spécifique (Google dans ce cas). Vous ne devriez pas détourner les jetons OAuth de Google pour les utiliser sur un autre site.

"...Un jeton sera renvoyé sur présentation d'un nom d'utilisateur et d'un mot de passe valides ou sur présentation d'un jeton tiers provenant de l'un des services vérifiables N..."

Attendez ! Vous attendez de Google qu'il vous dise si un jeton provenant de ses API basées sur OAuth appartient à un compte donné ? Ce n'est pas très sûr. Je ne pense pas que vous trouverez ce que vous cherchez.

Essayez OpenID. Ce que vous voulez vraiment, c'est permettre aux utilisateurs de s'authentifier sur votre site en utilisant des informations d'identification provenant d'ailleurs. C'est le rôle d'OpenID, pas d'OAuth.

1voto

Mark Points 49079

Voici un exemple utilisant Gicleur :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0voto

Essayer de faire une demande valide et vérifier si le jeton n'est pas invalide dans la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X