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.

200voto

Vinoj John Hosan Points 160

Pour le contrôle de l'utilisateur, il suffit de poster d'obtenir le jeton d'accès en tant que accessToken, de le poster et d'obtenir la réponse.

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

Vous pouvez également essayer dans la barre d'adresse des navigateurs, utiliser httppost et response en Java.

la réponse sera la suivante

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Le champ d'application est la permission donnée à l'accessToken. Vous pouvez vérifier les identifiants de champ d'application dans ce lien

Mise à jour : Nouvelle API comme suit

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

La réponse sera la suivante

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Pour plus d'informations, https://developers.google.com/identity/sign-in/Android/backend-auth

118voto

Remco Points 318

Ok, la plupart des réponses sont valables mais pas tout à fait correctes. L'idée de JWT est que vous pouvez valider le jeton sans avoir à contacter l'émetteur à chaque fois. Vous devez vérifier l'identité et la signature du jeton avec la clé publique connue du certificat Google utilisé pour signer le jeton.

Voir le prochain article pour savoir pourquoi et comment procéder.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/

46voto

Nick Tsai Points 1217

Vous pouvez vérifier un jeton d'accès d'authentification Google en utilisant ce point de terminaison :

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Il s'agit du point de terminaison de validation de Google V3 OAuth AccessToken, vous pouvez vous référer au document de Google ci-dessous : (En OAUTH 2.0 ENDPOINTS Tab)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

21voto

Steev James Points 113

Utilisez le point de terminaison ci-dessous pour obtenir des informations sur l'utilisateur telles que le nom, l'adresse électronique, la photo, etc.

https://www.googleapis.com/oauth2/v3/userinfo?access_token=<access token>

Utilisez le point de terminaison ci-dessous pour obtenir des informations sur le jeton, telles que le délai d'expiration, l'étendue du jeton, etc.

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access token>

18voto

ahmed Points 136
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}

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