Po zwróceniu przez Google tokena identyfikatora jest on przesyłany za pomocą żądania metody HTTP POST
o nazwie parametru credential
do punktu końcowego logowania.
Poniżej znajdziesz przykład w języku Python, który przedstawia standardowe kroki weryfikacji i wykorzystywania tokena identyfikatora:
Zweryfikuj token sfałszowania żądania między witrynami (CSRF). Gdy przesyłasz dane logowania do punktu końcowego logowania, stosujemy wzorzec double-submit-cookie, aby zapobiegać atakom CSRF. Przed każdym przesłaniem generujemy token. Następnie token jest umieszczany zarówno w pliku cookie, jak i w treści posta, jak w tym przykładzie kodu:
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.')
Zweryfikuj token identyfikatora.
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.
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.Korzystanie z biblioteki klienta interfejsów API Google
Użycie jednej z bibliotek klienta interfejsu API Google (np. Java, Node.js, PHP lub Python) to zalecany sposób weryfikacji tokenów identyfikatorów Google w środowisku produkcyjnym.
Java Aby zweryfikować token identyfikatora w Javie, użyj obiektu GoogleIdTokenVerifier. Na przykład:
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."); }
Metoda
GoogleIdTokenVerifier.verify()
weryfikuje podpis JWT, deklaracjeaud
,iss
iexp
.Jeśli chcesz sprawdzić, czy token identyfikatora reprezentuje konto organizacji w Google Workspace lub Cloud, możesz zweryfikować zgłoszenie
hd
, sprawdzając nazwę domeny zwracaną przez metodęPayload.getHostedDomain()
. Domena w zgłoszeniuemail
nie jest wystarczająca, aby upewnić się, że konto jest zarządzane przez domenę lub organizację.Node.js Aby zweryfikować token identyfikatora w Node.js, użyj biblioteki uwierzytelniania Google dla Node.js. Zainstaluj bibliotekę:
npm install google-auth-library --save
Następnie wywołaj funkcjęverifyIdToken()
. Na przykład: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);
Funkcja
verifyIdToken
weryfikuje podpis JWT,aud
,exp
iiss
.Aby sprawdzić, czy token identyfikatora reprezentuje konto organizacji w Google Workspace lub Cloud, możesz zapoznać się z deklaracją
hd
, która wskazuje hostowaną domenę użytkownika. Tej opcji należy używać, gdy ograniczasz dostęp do zasobu tylko do użytkowników z określonych domen. Brak takiego roszczenia oznacza, że konto nie należy do domeny hostowanej przez Google.PHP Aby zweryfikować token identyfikatora w języku PHP, użyj biblioteki klienta interfejsu API Google dla języka PHP. Zainstaluj bibliotekę (na przykład za pomocą narzędzia Composer):
composer require google/apiclient
Następnie wywołaj funkcjęverifyIdToken()
. Na przykład: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 }
Funkcja
verifyIdToken
weryfikuje podpis JWT,aud
,exp
iiss
.Aby sprawdzić, czy token identyfikatora reprezentuje konto organizacji w Google Workspace lub Cloud, możesz zapoznać się z deklaracją
hd
, która wskazuje hostowaną domenę użytkownika. Tej opcji należy używać, gdy ograniczasz dostęp do zasobu tylko do użytkowników z określonych domen. Brak takiego roszczenia oznacza, że konto nie należy do domeny hostowanej przez Google.Python Aby zweryfikować token identyfikatora w Pythonie, użyj funkcji verify_oauth2_token. Na przykład:
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
Funkcja
verify_oauth2_token
weryfikuje podpis JWT, deklaracjęaud
i deklaracjęexp
. Musisz też zweryfikować żądaniehd
(jeśli dotyczy), sprawdzając obiekt zwracany przezverify_oauth2_token
. Jeśli do serwera backendu uzyskuje dostęp wielu klientów, również ręcznie zweryfikuj deklarację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
Po potwierdzeniu poprawności tokena możesz używać informacji z tokena identyfikatora Google do korelacji stanu konta witryny:
Niezarejestrowany użytkownik: możesz pokazać interfejs do rejestracji, w którym będzie mógł on w razie potrzeby podać dodatkowe informacje o profilu. Umożliwia też dyskretne utworzenie nowego konta i sesję zalogowanego użytkownika.
Istniejące konto w Twojej witrynie: możesz pokazać stronę internetową, na której użytkownik będzie mógł wpisać hasło i połączyć starsze konto z danymi logowania Google. Jest to potwierdzenie, że użytkownik ma dostęp do istniejącego konta.
Powracający użytkownik sfederowany: możesz dyskretnie zalogować użytkownika.