Une fois que Google a renvoyé un jeton d'ID, il est envoyé à votre point de terminaison de connexion par une requête de méthode HTTP POST
, avec le nom de paramètre credential
.
Voici un exemple en langage Python qui montre les étapes habituelles pour valider et utiliser le jeton d'ID:
Vérifiez le jeton CSRF (Cross-Site Request Forgery). Lorsque vous envoyez des identifiants à votre point de terminaison de connexion, nous utilisons le modèle de double envoi de cookies pour empêcher les attaques CSRF. Avant chaque envoi, nous générons un jeton. Ensuite, le jeton est placé à la fois dans le cookie et dans le corps de la publication, comme illustré dans l'exemple de code suivant:
csrf_token_cookie = self.request.cookies.get('g_csrf_token') if not csrf_token_cookie: webapp2.abort(400, 'No CSRF token in Cookie.') csrf_token_body = self.request.get('g_csrf_token') if not csrf_token_body: webapp2.abort(400, 'No CSRF token in post body.') if csrf_token_cookie != csrf_token_body: webapp2.abort(400, 'Failed to verify double submit cookie.')
Vérifiez le jeton d'ID.
Pour vérifier que le jeton est valide, assurez-vous que les éléments suivants critères sont remplis:
- Le jeton d'ID est correctement signé par Google. Utiliser les clés publiques de Google
(disponible en
JWK ou
PEM).
pour vérifier la signature du jeton. Ces clés font l'objet d'une rotation régulière. examiner
l'en-tête
Cache-Control
dans la réponse pour déterminer quand vous devez les récupérer à nouveau. - La valeur de
aud
dans le jeton d'ID est égale à l'une des d'identifiants clients. Cette vérification est nécessaire pour empêcher les jetons d'identification émis vers application utilisée pour accéder aux données concernant le même utilisateur sur le serveur backend de votre application. - La valeur de
iss
dans le jeton d'ID est égale àaccounts.google.com
ouhttps://accounts.google.com
. - Le délai d'expiration (
exp
) du jeton d'ID n'est pas écoulé. - Si vous devez vérifier que le jeton d'ID représente un compte Google Workspace ou
compte d'organisation, vous pouvez consulter la revendication
hd
, qui indique domaine de l'utilisateur. Il doit être utilisé lorsque vous restreignez l'accès à une ressource aux seuls membres de certains domaines. L'absence de cette réclamation indique que le compte n'appartient pas à un Domaine hébergé par Google.
À l'aide des champs
email
,email_verified
ethd
, vous pouvez déterminer Google héberge les adresses e-mail et fait autorité pour celles-ci. Dans les cas où Google fait autorité, l'utilisateur est connu comme étant le titulaire légitime du compte, et vous pouvez ignorer le mot de passe ou d'autres méthodes de défi.Cas dans lesquels Google fait autorité:
email
comporte le suffixe@gmail.com
. Il s'agit d'un compte Gmail.email_verified
est "true" ethd
est défini. Il s'agit d'un compte G Suite.
Les utilisateurs peuvent créer un compte Google sans utiliser Gmail ni G Suite. Quand ?
email
ne contient pas de suffixe@gmail.com
ethd
est absent, Google ne l'est pas faisant autorité et un mot de passe ou d'autres méthodes d'authentification sont recommandés pour l'utilisateur.email_verified
peut également être défini sur "true", car Google a initialement validé utilisateur lors de la création du compte Google, quelle que soit la propriété du tiers compte de messagerie peut avoir changé depuis.Plutôt que d'écrire votre propre code pour effectuer ces vérifications, nous vous recommandons vous pouvez utiliser une bibliothèque cliente des API Google pour votre plate-forme JWT. Pour le développement et le débogage, vous pouvez appeler notre
tokeninfo
point de terminaison de validation.Using a Google API Client Library
Using one of the Google API Client Libraries (e.g. Java, Node.js, PHP, Python) is the recommended way to validate Google ID tokens in a production environment.
Java To validate an ID token in Java, use the GoogleIdTokenVerifier object. For example:
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; ... GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory) // Specify the WEB_CLIENT_ID of the app that accesses the backend: .setAudience(Collections.singletonList(WEB_CLIENT_ID)) // Or, if multiple clients access the backend: //.setAudience(Arrays.asList(WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3)) .build(); // (Receive idTokenString by HTTPS POST) GoogleIdToken idToken = verifier.verify(idTokenString); if (idToken != null) { Payload payload = idToken.getPayload(); // Print user identifier String userId = payload.getSubject(); System.out.println("User ID: " + userId); // Get profile information from payload String email = payload.getEmail(); boolean emailVerified = Boolean.valueOf(payload.getEmailVerified()); String name = (String) payload.get("name"); String pictureUrl = (String) payload.get("picture"); String locale = (String) payload.get("locale"); String familyName = (String) payload.get("family_name"); String givenName = (String) payload.get("given_name"); // Use or store profile information // ... } else { System.out.println("Invalid ID token."); }
The
GoogleIdTokenVerifier.verify()
method verifies the JWT signature, theaud
claim, theiss
claim, and theexp
claim.If you need to validate that the ID token represents a Google Workspace or Cloud organization account, you can verify the
hd
claim by checking the domain name returned by thePayload.getHostedDomain()
method. The domain of theemail
claim is insufficient to ensure that the account is managed by a domain or organization.Node.js To validate an ID token in Node.js, use the Google Auth Library for Node.js. Install the library:
Then, call thenpm install google-auth-library --save
verifyIdToken()
function. For example:const {OAuth2Client} = require('google-auth-library'); const client = new OAuth2Client(); async function verify() { const ticket = await client.verifyIdToken({ idToken: token, audience: WEB_CLIENT_ID, // Specify the WEB_CLIENT_ID of the app that accesses the backend // Or, if multiple clients access the backend: //[WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3] }); const payload = ticket.getPayload(); const userid = payload['sub']; // If the request specified a Google Workspace domain: // const domain = payload['hd']; } verify().catch(console.error);
The
verifyIdToken
function verifies the JWT signature, theaud
claim, theexp
claim, and theiss
claim.If you need to validate that the ID token represents a Google Workspace or Cloud organization account, you can check the
hd
claim, which indicates the hosted domain of the user. This must be used when restricting access to a resource to only members of certain domains. The absence of this claim indicates that the account does not belong to a Google hosted domain.PHP To validate an ID token in PHP, use the Google API Client Library for PHP. Install the library (for example, using Composer):
Then, call thecomposer require google/apiclient
verifyIdToken()
function. For example:require_once 'vendor/autoload.php'; // Get $id_token via HTTPS POST. $client = new Google_Client(['client_id' => $WEB_CLIENT_ID]); // Specify the WEB_CLIENT_ID of the app that accesses the backend $payload = $client->verifyIdToken($id_token); if ($payload) { $userid = $payload['sub']; // If the request specified a Google Workspace domain //$domain = $payload['hd']; } else { // Invalid ID token }
The
verifyIdToken
function verifies the JWT signature, theaud
claim, theexp
claim, and theiss
claim.If you need to validate that the ID token represents a Google Workspace or Cloud organization account, you can check the
hd
claim, which indicates the hosted domain of the user. This must be used when restricting access to a resource to only members of certain domains. The absence of this claim indicates that the account does not belong to a Google hosted domain.Python To validate an ID token in Python, use the verify_oauth2_token function. For example:
from google.oauth2 import id_token from google.auth.transport import requests # (Receive token by HTTPS POST) # ... try: # Specify the WEB_CLIENT_ID of the app that accesses the backend: idinfo = id_token.verify_oauth2_token(token, requests.Request(), WEB_CLIENT_ID) # Or, if multiple clients access the backend server: # idinfo = id_token.verify_oauth2_token(token, requests.Request()) # if idinfo['aud'] not in [WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3]: # raise ValueError('Could not verify audience.') # If the request specified a Google Workspace domain # if idinfo['hd'] != DOMAIN_NAME: # raise ValueError('Wrong domain name.') # ID token is valid. Get the user's Google Account ID from the decoded token. userid = idinfo['sub'] except ValueError: # Invalid token pass
The
verify_oauth2_token
function verifies the JWT signature, theaud
claim, and theexp
claim. You must also verify thehd
claim (if applicable) by examining the object thatverify_oauth2_token
returns. If multiple clients access the backend server, also manually verify theaud
claim.- Le jeton d'ID est correctement signé par Google. Utiliser les clés publiques de Google
(disponible en
JWK ou
PEM).
pour vérifier la signature du jeton. Ces clés font l'objet d'une rotation régulière. examiner
l'en-tête
Une fois la validité du jeton confirmée, vous pouvez utiliser les informations du jeton d'ID Google pour mettre en corrélation l'état du compte de votre site:
Utilisateur non enregistré:vous pouvez afficher une interface utilisateur (UI) de connexion qui permet à l'utilisateur de fournir des informations de profil supplémentaires, si nécessaire. Il permet également à l'utilisateur de créer le nouveau compte et une session utilisateur connectée de manière silencieuse.
Un compte existant sur votre site:vous pouvez afficher une page Web permettant à l'utilisateur final de saisir son mot de passe et d'associer l'ancien compte à ses identifiants Google. Cela confirme que l'utilisateur a accès au compte existant.
Utilisateur fédéré connu:vous pouvez le connecter de manière silencieuse.