Authenticate with a backend using ID tokens  |  Authentication  |  Google for Developers (2024)

The One Tap sign-in client retrieves a Google ID token when the user selects aGoogle Account. An ID token is a signed assertion of a user's identity that alsocontains a user's basic profile information, possibly including an email addressthat has been verified by Google.

When ID tokens are available, you can use them to securely authenticate withyour app's backend, or to automatically sign up the user for a new accountwithout the need to verify the user's email address.

To sign in or sign up a user with an ID token, send the token to your app'sbackend. On the backend, verify the token using either a Google API clientlibrary or a general-purpose JWT library. If the user hasn't signed in to yourapp with this Google Account before, create a new account.

If you've optionally chosen to use a nonce to help avoid replay attacks, usegetNonceto send it along with the ID Token to your backend server, and check for theexpected value. We recommend that you strongly consider using a nonce toimprove user safety and security.

Get an ID token from the credentials object

After you retrieve a user's credentials, check if the credentials objectincludes an ID token. If it does, send it to your backend.

Java

public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } }}

Kotlin

class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ...}

Verify the integrity of the ID token

After you receive the ID token by HTTPS POST, you must verify the integrity of the 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.

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 CLIENT_ID of the app that accesses the backend: .setAudience(Collections.singletonList(CLIENT_ID)) // Or, if multiple clients access the backend: //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, 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: CLIENT_ID, // Specify the CLIENT_ID of the app that accesses the backend // Or, if multiple clients access the backend: //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3] }); const payload = ticket.getPayload(); const userid = payload['sub']; // If request specified a G Suite 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' => $CLIENT_ID]); // Specify the CLIENT_ID of the app that accesses the backend$payload = $client->verifyIdToken($id_token);if ($payload) { $userid = $payload['sub']; // If request specified a G Suite 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_tokenfrom google.auth.transport import requests# (Receive token by HTTPS POST)# ...try: # Specify the CLIENT_ID of the app that accesses the backend: idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID) # Or, if multiple clients access the backend server: # idinfo = id_token.verify_oauth2_token(token, requests.Request()) # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]: # raise ValueError('Could not verify audience.') # If auth request is from a G Suite domain: # if idinfo['hd'] != GSUITE_DOMAIN_NAME: # raise ValueError('Wrong hosted domain.') # 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.

Calling the tokeninfo endpoint

An easy way to validate an ID token signature for debugging is to use the tokeninfo endpoint. Calling this endpoint involves an additional network request that does most of the validation for you while you test proper validation and payload extraction in your own code. It is not suitable for use in production code as requests may be throttled or otherwise subject to intermittent errors.

To validate an ID token using the tokeninfo endpoint, make an HTTPS POST or GET request to the endpoint, and pass your ID token in the id_token parameter. For example, to validate the token "XYZ123", make the following GET request:

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

If the token is properly signed and the iss and exp claims have the expected values, you will get a HTTP 200 response, where the body contains the JSON-formatted ID token claims. Here's an example response:

{ // 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": "[email protected]", "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"}

If you need to validate that the ID token represents a Google Workspace 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 Workspace hosted domain.

Create an account or session

After you have verified the token, check if the user is already in your user database. If so, establish an authenticated session for the user. If the user isn't yet in your user database, create a new user record from the information in the ID token payload, and establish a session for the user. You can prompt the user for any additional profile information you require when you detect a newly created user in your app.

Securing your users' accounts with Cross Account Protection

When you rely on Google to sign in a user, you'll automatically benefit from all of the security features and infrastructure Google has built to safeguard the user's data. However, in the unlikely event that the user's Google Account gets compromised or there is some other significant security event, your app can also be vulnerable to attack. To better protect your accounts from any major security events, use Cross Account Protection to receive security alerts from Google. When you receive these events, you gain visibility into important changes to the security of the user's Google account and you can then take action on your service to secure your accounts.

Authenticate with a backend using ID tokens  |  Authentication  |  Google for Developers (2024)

FAQs

How do you authenticate with a backend using ID tokens? ›

To sign in or sign up a user with an ID token, send the token to your app's backend. On the backend, verify the token using either a Google API client library or a general-purpose JWT library. If the user hasn't signed in to your app with this Google Account before, create a new account.

Can ID token be used for authentication? ›

ID tokens are used in token-based authentication to cache user profile information and provide it to a client application, thereby providing better performance and experience.

What is the ID token in Google Authenticator? ›

ID tokens are JSON Web Tokens (JWTs) that conform to the OpenID Connect (OIDC) specification. They are composed of a set of key-value pairs called claims. Unlike access tokens, which are opaque objects that cannot be inspected by the application, ID tokens are meant to be inspected and used by the application.

Top Articles
Teaching Science: Subject by Subject, Part 12 - Simply Charlotte Mason
Limit Up: What It Is, How It Works, Example
Why Are Fuel Leaks A Problem Aceable
Dragon Age Inquisition War Table Operations and Missions Guide
Amc Near My Location
Practical Magic 123Movies
Www Craigslist Louisville
2022 Apple Trade P36
Volstate Portal
Steve Strange - From Punk To New Romantic
Jasmine
Gina's Pizza Port Charlotte Fl
How To Delete Bravodate Account
Simple Steamed Purple Sweet Potatoes
Ree Marie Centerfold
Bjork & Zhulkie Funeral Home Obituaries
Saberhealth Time Track
24 Best Things To Do in Great Yarmouth Norfolk
Check From Po Box 1111 Charlotte Nc 28201
Accident On May River Road Today
Effingham Bookings Florence Sc
Ge-Tracker Bond
Pjs Obits
Hewn New Bedford
Doctors of Optometry - Westchester Mall | Trusted Eye Doctors in White Plains, NY
Speechwire Login
N.J. Hogenkamp Sons Funeral Home | Saint Henry, Ohio
What Is Opm1 Treas 310 Deposit
Deepwoken: Best Attunement Tier List - Item Level Gaming
Evil Dead Rise - Everything You Need To Know
James Ingram | Biography, Songs, Hits, & Cause of Death
Beaver Saddle Ark
All Things Algebra Unit 3 Homework 2 Answer Key
R&J Travel And Tours Calendar
USB C 3HDMI Dock UCN3278 (12 in 1)
One Main Branch Locator
2020 Can-Am DS 90 X Vs 2020 Honda TRX90X: By the Numbers
Verizon Outage Cuyahoga Falls Ohio
Cl Bellingham
US-amerikanisches Fernsehen 2023 in Deutschland schauen
Advance Auto.parts Near Me
Vci Classified Paducah
Minecraft: Piglin Trade List (What Can You Get & How)
Acuity Eye Group - La Quinta Photos
Zits Comic Arcamax
Bama Rush Is Back! Here Are the 15 Most Outrageous Sorority Houses on the Row
Definition of WMT
Brutus Bites Back Answer Key
Gelato 47 Allbud
Gear Bicycle Sales Butler Pa
Coldestuknow
Latest Posts
Article information

Author: Manual Maggio

Last Updated:

Views: 5786

Rating: 4.9 / 5 (49 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Manual Maggio

Birthday: 1998-01-20

Address: 359 Kelvin Stream, Lake Eldonview, MT 33517-1242

Phone: +577037762465

Job: Product Hospitality Supervisor

Hobby: Gardening, Web surfing, Video gaming, Amateur radio, Flag Football, Reading, Table tennis

Introduction: My name is Manual Maggio, I am a thankful, tender, adventurous, delightful, fantastic, proud, graceful person who loves writing and wants to share my knowledge and understanding with you.