Verify the Google ID token on your server side

After Google returns an ID token, it's submitted by an HTTP POST method request, with the parameter name credential , to your login endpoint.

The following is an example in the Python language that shows the usual steps to validate and consume the ID token:

  1. Verify the Cross-Site Request Forgery (CSRF) token. When you submit credentials to your login endpoint, we use the double-submit-cookie pattern to prevent CSRF attacks. Before each submission, we generate a token. Then, the token is put into both the cookie and the post body, as shown in the following code example:

      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.' 
     ) 
     
    
  2. Verify the ID token.

    To verify that the token is valid, ensure that the following criteria are satisfied:

    • The ID token is properly signed by Google. Use Google's public keys (available in JWK or PEM format) to verify the token's signature. These keys are regularly rotated; examine the Cache-Control header in the response to determine when you should retrieve them again.
    • The value of aud in the ID token is equal to one of your app's client IDs. This check is necessary to prevent ID tokens issued to a malicious app being used to access data about the same user on your app's backend server.
    • The value of iss in the ID token is equal to accounts.google.com or https://accounts.google.com .
    • The expiry time ( exp ) of the ID token has not passed.
    • 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.

    Using the email , email_verified and hd fields, you can determine if Google hosts and is authoritative for an email address. In the cases where Google is authoritative, the user is known to be the legitimate account owner, and you may skip password or other challenge methods.

    Cases where Google is authoritative:

    • email has a @gmail.com suffix, this is a Gmail account.
    • email_verified is true and hd is set, this is a Google Workspace account.

    Users may register for Google Accounts without using Gmail or Google Workspace. When email does not contain a @gmail.com suffix and hd is absent, Google is not authoritative and password or other challenge methods are recommended to verify the user. email_verified can also be true as Google initially verified the user when the Google account was created, however ownership of the third party email account may have since changed.

    Rather than writing your own code to perform these verification steps, we strongly recommend using a Google API client library for your platform, or a general-purpose JWT library. For development and debugging, you can call our tokeninfo validation endpoint.

    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, the aud claim, the iss claim, and the exp 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 the Payload.getHostedDomain() method. The domain of the email 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:

    npm install google-auth-library --save
    Then, call the 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, the aud claim, the exp claim, and the iss 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):

    composer require google/apiclient
    Then, call the 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, the aud claim, the exp claim, and the iss 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, the aud claim, and the exp claim. You must also verify the hd claim (if applicable) by examining the object that verify_oauth2_token returns. If multiple clients access the backend server, also manually verify the aud claim.

  3. Once the token's validity is confirmed, you can use the information in the Google ID token to correlate the account status of your site:

    • An unregistered user:You can show a sign-up user interface (UI) that allows the user to provide additional profile information, if required. It also allows the user to silently create the new account and a logged-in user session.

    • An existing account that already exists in your site:You can show a web page that allows the end user to input their password and link the legacy account with their Google credentials. This confirms that the user has access to the existing account.

    • A returning federated user:You can silently sign the user in.

Design a Mobile Site
View Site in Mobile | Classic
Share by: