После того как Google возвращает токен идентификатора, он отправляется с помощью запроса метода HTTP POST
с именем параметра credential
в конечную точку входа.
Ниже приведен пример на языке Python, показывающий обычные шаги по проверке и использованию токена идентификатора:
Проверьте токен межсайтовой подделки запросов (CSRF). Когда вы отправляете учетные данные на свою конечную точку входа, мы используем шаблон двойной отправки файлов cookie для предотвращения атак CSRF. Перед каждой отправкой мы генерируем токен. Затем токен помещается как в файл cookie, так и в тело сообщения, как показано в следующем примере кода:
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.')
Проверьте идентификационный токен.
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 toaccounts.google.com
orhttps://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
andhd
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 andhd
is set, this is a G Suite account.
Users may register for Google Accounts without using Gmail or G Suite. When
email
does not contain a@gmail.com
suffix andhd
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.Использование клиентской библиотеки Google API
Использование одной из клиентских библиотек Google API (например, Java , Node.js , PHP , Python ) — рекомендуемый способ проверки токенов Google ID в производственной среде.
Ява Чтобы проверить токен идентификатора в Java, используйте объект GoogleIdTokenVerifier . Например:
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."); }
Метод
GoogleIdTokenVerifier.verify()
проверяет подпись JWT, утверждениеaud
, утверждениеiss
и утверждениеexp
.Если вам необходимо убедиться, что токен идентификатора представляет учетную запись организации Google Workspace или Cloud, вы можете проверить утверждение
hd
, проверив имя домена, возвращаемое методомPayload.getHostedDomain()
. Домен заявкиemail
недостаточен, чтобы гарантировать, что учетная запись управляется доменом или организацией.Node.js Чтобы проверить токен идентификатора в Node.js, используйте библиотеку Google Auth для Node.js. Установите библиотеку:
Затем вызовитеnpm install google-auth-library --save
verifyIdToken()
. Например: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 the request specified a Google Workspace domain: // const domain = payload['hd']; } verify().catch(console.error);
verifyIdToken
проверяет подпись JWT, утверждениеaud
, утверждениеexp
и утверждениеiss
.Если вам необходимо убедиться, что токен идентификатора представляет учетную запись организации Google Workspace или Cloud, вы можете проверить утверждение
hd
, которое указывает размещенный домен пользователя. Это необходимо использовать при ограничении доступа к ресурсу только для членов определенных доменов. Отсутствие этого утверждения указывает на то, что учетная запись не принадлежит домену, размещенному в Google.PHP Чтобы проверить токен идентификатора в PHP, используйте клиентскую библиотеку Google API для PHP . Установите библиотеку (например, с помощью Composer):
Затем вызовитеcomposer require google/apiclient
verifyIdToken()
. Например: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 the request specified a Google Workspace domain //$domain = $payload['hd']; } else { // Invalid ID token }
verifyIdToken
проверяет подпись JWT, утверждениеaud
, утверждениеexp
и утверждениеiss
.Если вам необходимо убедиться, что токен идентификатора представляет учетную запись организации Google Workspace или Cloud, вы можете проверить утверждение
hd
, которое указывает размещенный домен пользователя. Это необходимо использовать при ограничении доступа к ресурсу только для членов определенных доменов. Отсутствие этого утверждения указывает на то, что учетная запись не принадлежит домену, размещенному в Google.Питон Чтобы проверить токен идентификатора в Python, используйте функциюverify_oauth2_token . Например:
from google.oauth2 import id_token from 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 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
verify_oauth2_token
проверяет подпись JWT, утверждениеaud
и утверждениеexp
. Вы также должны проверить утверждениеhd
(если применимо), проверив объект, которыйverify_oauth2_token
. Если несколько клиентов обращаются к внутреннему серверу, также вручную проверьте утверждениеaud
.- 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
После подтверждения действительности токена вы можете использовать информацию в токене Google ID для сопоставления статуса учетной записи вашего сайта:
Незарегистрированный пользователь: вы можете отобразить пользовательский интерфейс регистрации (UI), который позволяет пользователю при необходимости предоставлять дополнительную информацию профиля. Это также позволяет пользователю автоматически создать новую учетную запись и войти в систему.
Существующая учетная запись, которая уже существует на вашем сайте. Вы можете показать веб-страницу, на которой конечный пользователь сможет ввести свой пароль и связать устаревшую учетную запись со своими учетными данными Google. Это подтверждает, что пользователь имеет доступ к существующей учетной записи.
Возвращающийся федеративный пользователь: вы можете автоматически войти в систему.