Mit einem Back-End-Server authentifizieren

Wenn Sie Google Log-in mit einer App oder Website verwenden, die mit einem Backend kommuniziert Server ist, müssen Sie möglicherweise den aktuell angemeldeten Nutzer auf dem Server identifizieren. Um dies sicher zu tun, senden Sie nach erfolgreicher Anmeldung eines Nutzers die ID-Token über HTTPS mit Ihrem Server. Prüfen Sie dann auf dem Server die Integrität des ID-Tokens und verwenden die darin enthaltenen Nutzerinformationen, um oder ein neues Konto erstellen.

ID-Token an den Server senden

Nachdem sich ein Nutzer erfolgreich angemeldet hat, rufen Sie sein ID-Token ab:

function onSignIn(googleUser) {
  var id_token = googleUser.getAuthResponse().id_token;
  ...
}

Senden Sie dann das ID-Token mit einer HTTPS-POST-Anfrage an Ihren Server:

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://yourbackend.example.com/tokensignin');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
  console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('idtoken=' + id_token);

Integrität des ID-Tokens prüfen

Nachdem Sie das ID-Token per HTTPS POST erhalten haben, müssen Sie die Integrität überprüfen des Tokens.

Prüfen Sie, ob das Token gültig ist: erfüllt sind:

  • Das ID-Token wurde von Google ordnungsgemäß signiert. Öffentliche Schlüssel von Google verwenden (verfügbar in JWK oder PEM-Format) um die Signatur des Tokens zu überprüfen. Diese Schlüssel werden regelmäßig rotiert. untersuchen den Cache-Control-Header in der Antwort, um zu bestimmen, wann sollten Sie sie erneut abrufen.
  • Der Wert von aud im ID-Token entspricht einem der Werte Client-IDs. Diese Prüfung ist erforderlich, um zu verhindern, dass ID-Tokens, die an einen App, die für den Zugriff auf Daten über denselben Nutzer auf dem Back-End-Server Ihrer App verwendet wird.
  • Der Wert von iss im ID-Token ist gleich accounts.google.com oder https://accounts.google.com.
  • Die Ablaufzeit (exp) des ID-Tokens ist noch nicht abgelaufen.
  • Wenn Sie prüfen müssen, ob das ID-Token für Google Workspace oder Cloud steht Unternehmenskonto haben, können Sie die hd-Anforderung prüfen, die angibt, Domain des Nutzers. Dies muss verwendet werden, wenn der Zugriff auf eine Ressource auf Mitglieder von bestimmten Domains. Fehlt dieser Anspruch, gehört das Konto nicht zu einem Von Google gehostete Domain.

Mit den Feldern email, email_verified und hd können Sie festlegen, Google hostet eine E-Mail-Adresse und ist für sie maßgeblich. In Fällen, in denen Google maßgeblich ist, dass der Nutzer als rechtmäßiger Kontoinhaber bekannt ist und Sie das Passwort oder andere Challenge-Methoden.

Fälle, in denen Google als vertrauenswürdig eingestuft wird:

  • email hat das Suffix @gmail.com. Dies ist ein Gmail-Konto.
  • email_verified ist „true“ und hd ist festgelegt. Dies ist ein G Suite-Konto.

Nutzer können sich für ein Google-Konto registrieren, ohne Gmail oder die G Suite zu verwenden. Wann? email enthält kein @gmail.com-Suffix und hd ist nicht vorhanden, Google nicht werden zur Bestätigung der Identität empfohlen, Nutzenden. email_verified kann auch „true“ sein, da Google das Nutzer beim Erstellen des Google-Kontos, die Inhaberschaft des Drittanbieters Ihr E-Mail-Konto hat sich in der Zwischenzeit möglicherweise geändert.

Sie müssen keinen eigenen Code für diese Bestätigungsschritte schreiben, empfehlen die Verwendung einer Google API-Client-Bibliothek für Ihre Plattform oder eine allgemeine JWT-Bibliothek. Für Entwicklung und Fehlerbehebung können Sie unser tokeninfo Validierungsendpunkt.

Google API-Clientbibliothek verwenden

Mit einer der Google API-Clientbibliotheken (z.B. Java Node.js PHP Python) wird empfohlen, um Google-ID-Tokens in einer Produktionsumgebung zu validieren.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Java

Verwenden Sie zum Validieren eines ID-Tokens in Java die Methode GoogleIdTokenVerifier-Objekt. Beispiel:

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.");
}

Die Methode GoogleIdTokenVerifier.verify() prüft das JWT Signatur, aud- und iss-Anforderung und exp-Anspruch.

Wenn Sie prüfen müssen, ob das ID-Token für Google Workspace oder Cloud steht Organisationskonto haben, können Sie die hd-Beanspruchung bestätigen, indem Sie den Domainnamen überprüfen Payload.getHostedDomain() zurückgegeben. Die Domain der Der Anspruch von email reicht nicht aus, um sicherzustellen, dass das Konto von einer Domain verwaltet wird oder einer Organisation.

<ph type="x-smartling-placeholder">
</ph>
Node.js

Verwenden Sie die Google-Authentifizierungsbibliothek für Node.js, um ein ID-Token in Node.js zu validieren. Installieren Sie die Bibliothek:

npm install google-auth-library --save
Rufen Sie dann die Funktion verifyIdToken() auf. Beispiel:

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);

Mit der Funktion verifyIdToken wird überprüft, die JWT-Signatur, die aud-Anforderung, die exp-Anforderung und die iss-Behauptung.

Wenn Sie prüfen müssen, ob das ID-Token für Google Workspace oder Cloud steht Unternehmenskonto haben, können Sie die hd-Anforderung prüfen, die angibt, Domain des Nutzers. Muss verwendet werden, wenn der Zugriff auf eine Ressource auf Mitglieder beschränkt wird von bestimmten Domains. Das Fehlen dieses Anspruchs bedeutet, dass das Konto nicht zu eine von Google gehostete Domain.

<ph type="x-smartling-placeholder">
</ph>
PHP

Um ein ID-Token in PHP zu validieren, verwenden Sie die Google API-Clientbibliothek für PHP. Installieren Sie die Bibliothek (z. B. mit Composer):

composer require google/apiclient
Rufen Sie dann die Funktion verifyIdToken() auf. Beispiel:

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
}

Mit der Funktion verifyIdToken wird überprüft, die JWT-Signatur, die aud-Anforderung, die exp-Anforderung und die iss-Behauptung.

Wenn Sie prüfen müssen, ob das ID-Token für Google Workspace oder Cloud steht Unternehmenskonto haben, können Sie die hd-Anforderung prüfen, die angibt, Domain des Nutzers. Muss verwendet werden, wenn der Zugriff auf eine Ressource auf Mitglieder beschränkt wird von bestimmten Domains. Das Fehlen dieses Anspruchs bedeutet, dass das Konto nicht zu eine von Google gehostete Domain.

<ph type="x-smartling-placeholder">
</ph>
Python

Verwenden Sie zum Validieren eines ID-Tokens in Python die Methode verify_oauth2_token . Beispiel:

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

Die Funktion verify_oauth2_token prüft das JWT Signatur, aud und exp. Sie müssen auch die hd bestätigen (falls zutreffend), indem wir das Objekt untersuchen, verify_oauth2_token kehrt zurück. Wenn mehrere Clients auf die Backend-Server, auch die aud-Anforderung manuell verifizieren.

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": "testuser@gmail.com",
 "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.

Konto oder Sitzung erstellen

Prüfen Sie nach der Bestätigung des Tokens, ob sich der Nutzer bereits bei Ihrem Nutzer befindet Datenbank. Wenn ja, richten Sie eine authentifizierte Sitzung für den Nutzer ein. Wenn der Nutzer befindet sich noch nicht in Ihrer Nutzerdatenbank, erstellen Sie anhand der Informationen in der Nutzlast des ID-Tokens und richten eine Sitzung für den Nutzer ein. Sie können den Nutzer auf zusätzliche Profilinformationen hin, die Sie benötigen, wenn Sie ein neu erstellten Nutzer in Ihrer App.

Schutz der Konten mit produktübergreifendem Kontoschutz

Wenn Sie einen Nutzer über Google anmelden, profitieren Sie automatisch von allen Sicherheitsfunktionen und die Infrastruktur, die Google zum Schutz der Nutzerdaten entwickelt hat. Sie können jedoch für den unwahrscheinlichen Fall, dass das Google-Konto des Nutzers gehackt wird ein Sicherheitsrisiko darstellt, kann deine App auch anfällig für Angriffe sein. Um Ihr Gerät besser zu schützen, vor allen wichtigen Sicherheitsvorfällen aktiviert haben, verwenden Sie Kontoübergreifende Schutz, um Sicherheitswarnungen von Google zu erhalten. Wenn Sie solche Ereignisse erhalten, Einblick in wichtige Änderungen für die Sicherheit des Google-Kontos des Nutzers und können Sie bei Ihrem Dienst Maßnahmen zum Schutz Ihrer Konten ergreifen.