Authentifizieren Sie sich mit einem Backend-Server

Wenn Sie Google Sign-In mit einer App oder Site verwenden, die mit einem Back-End-Server kommuniziert, müssen Sie möglicherweise den aktuell angemeldeten Benutzer auf dem Server identifizieren. Um dies sicher zu tun, senden Sie nach erfolgreicher Anmeldung eines Benutzers das ID-Token des Benutzers mithilfe von HTTPS an Ihren Server. Überprüfen Sie dann auf dem Server die Integrität des ID-Tokens und verwenden Sie die im Token enthaltenen Benutzerinformationen, um eine Sitzung einzurichten oder ein neues Konto zu erstellen.

Senden Sie das ID-Token an Ihren Server

Nachdem sich ein Benutzer erfolgreich angemeldet hat, erhalten Sie das ID-Token des Benutzers:

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

Senden Sie dann das ID-Token mit einer HTTPS-POST-Anforderung 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);

Überprüfen Sie die Integrität des ID-Tokens

Nachdem Sie das ID-Token per HTTPS-POST erhalten haben, müssen Sie die Integrität des Tokens überprüfen. Stellen Sie sicher, dass die folgenden Kriterien erfüllt sind, um die Gültigkeit des Tokens zu überprüfen:

  • Das ID-Token ist ordnungsgemäß von Google signiert. Verwenden Sie die öffentlichen Schlüssel von Google (verfügbar im JWK- oder PEM- Format), um die Signatur des Tokens zu überprüfen. Diese Tasten werden regelmäßig gedreht. Untersuchen Sie den Cache-Control Header in der Antwort, um festzustellen, wann Sie sie erneut abrufen sollten.
  • Der Wert von aud im ID-Token entspricht einer der Client-IDs Ihrer App. Diese Überprüfung ist erforderlich, um zu verhindern, dass ID-Token, die an eine bösartige App ausgegeben wurden, verwendet werden, um auf Daten desselben Benutzers auf dem Back-End-Server Ihrer App zuzugreifen.
  • Der Wert von iss im ID-Token entspricht accounts.google.com oder https://accounts.google.com .
  • Die Ablaufzeit ( exp ) des ID-Tokens ist nicht abgelaufen.
  • Wenn Sie den Zugriff nur auf Mitglieder Ihrer G Suite-Domäne beschränken möchten, stellen Sie sicher, dass das ID-Token einen hd Anspruch hat, der mit Ihrem G Suite-Domänennamen übereinstimmt.

Anstatt Ihren eigenen Code zu schreiben, um diese Überprüfungsschritte auszuführen, empfehlen wir dringend, eine Google API-Clientbibliothek für Ihre Plattform oder eine universelle JWT-Bibliothek zu verwenden. Für die Entwicklung und das Debuggen können Sie unseren tokeninfo Validierungsendpunkt tokeninfo .

Verwenden einer Google API-Clientbibliothek

Die Verwendung einer der Google API-Clientbibliotheken (z. B. Java , Node.js , PHP , Python ) ist die empfohlene Methode zum Überprüfen von Google ID-Token in einer Produktionsumgebung.

Java

Verwenden Sie das GoogleIdTokenVerifier- Objekt, um ein ID-Token in Java zu überprüfen . Beispielsweise:

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 GoogleIdTokenVerifier.verify() -Methode überprüft die JWT-Signatur, den aud Anspruch, den iss Anspruch und den exp Anspruch.

Wenn Sie den Zugriff nur auf Mitglieder Ihrer G Suite-Domäne beschränken möchten, überprüfen Sie auch den hd Anspruch, indem Sie den von der Payload.getHostedDomain() -Methode zurückgegebenen Payload.getHostedDomain() überprüfen.

Node.js

Verwenden Sie die Google Auth Library für Node.js, um ein ID-Token in Node.js zu überprüfen . Installieren Sie die Bibliothek:

npm install google-auth-library --save
Rufen Sie anschließend die Funktion verifyIdToken() . Beispielsweise:

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
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);

Die Funktion verifyIdToken überprüft die JWT-Signatur, den aud Anspruch, den exp Anspruch und den iss Anspruch.

Wenn Sie den Zugriff nur auf Mitglieder Ihrer G Suite-Domain beschränken möchten, überprüfen Sie auch, ob der hd Anspruch mit Ihrem G Suite-Domainnamen übereinstimmt.

PHP

Verwenden Sie zum Überprüfen eines ID-Tokens in PHP die Google API-Clientbibliothek für PHP . Installieren Sie die Bibliothek (z. B. mit Composer):

composer require google/apiclient
Rufen Sie anschließend die Funktion verifyIdToken() . Beispielsweise:

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
}

Die Funktion verifyIdToken überprüft die JWT-Signatur, den aud Anspruch, den exp Anspruch und den iss Anspruch.

Wenn Sie den Zugriff nur auf Mitglieder Ihrer G Suite-Domain beschränken möchten, überprüfen Sie auch, ob der hd Anspruch mit Ihrem G Suite-Domainnamen übereinstimmt.

Python

Verwenden Sie die Funktion verify_oauth2_token, um ein ID-Token in Python zu überprüfen . Beispielsweise:

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

Die Funktion verify_oauth2_token überprüft die JWT-Signatur, den aud Anspruch und den exp Anspruch. Sie müssen den hd Anspruch (falls zutreffend) auch überprüfen, indem Sie das Objekt verify_oauth2_token , das verify_oauth2_token zurückgibt. Wenn mehrere Clients auf den Back-End-Server zugreifen, überprüfen Sie den aud Anspruch auch manuell.

Aufruf des Tokeninfo-Endpunkts

Eine einfache Möglichkeit, eine ID-Token-Signatur für das Debuggen zu tokeninfo ist die Verwendung des tokeninfo Endpunkts. Das Aufrufen dieses Endpunkts umfasst eine zusätzliche Netzwerkanforderung, die den größten Teil der Validierung für Sie erledigt, während Sie die ordnungsgemäße Validierung und Nutzlastextraktion in Ihrem eigenen Code testen. Es ist nicht für die Verwendung im Produktionscode geeignet, da Anforderungen möglicherweise gedrosselt werden oder auf andere Weise zeitweise fehlerhaft sind.

Um ein ID-Token mithilfe des tokeninfo Endpunkts zu tokeninfo , tokeninfo eine HTTPS- tokeninfo oder GET-Anforderung an den Endpunkt und übergeben Sie Ihr ID-Token im Parameter id_token . Um beispielsweise das Token "XYZ123" zu validieren, stellen Sie die folgende GET-Anforderung:

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

Wenn das Token ordnungsgemäß signiert ist und die Ansprüche iss und exp die erwarteten Werte haben, erhalten Sie eine HTTP 200-Antwort, in der der Body die JSON-formatierten ID-Token-Ansprüche enthält. Hier ist eine Beispielantwort:

{
 // 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"
}

Wenn Sie ein G Suite-Kunde sind, könnte Sie auch der hd Anspruch interessieren, der die gehostete Domain des Benutzers angibt. Dies kann verwendet werden, um den Zugriff auf eine Ressource nur auf Mitglieder bestimmter Domänen zu beschränken. Das Fehlen dieses Anspruchs weist darauf hin, dass der Benutzer keiner von G Suite gehosteten Domäne angehört.

Erstellen Sie ein Konto oder eine Sitzung

Nachdem Sie das Token überprüft haben, überprüfen Sie, ob sich der Benutzer bereits in Ihrer Benutzerdatenbank befindet. Wenn ja, richten Sie eine authentifizierte Sitzung für den Benutzer ein. Wenn sich der Benutzer noch nicht in Ihrer Benutzerdatenbank befindet, erstellen Sie aus den Informationen in der ID-Token-Nutzlast einen neuen Benutzerdatensatz und richten Sie eine Sitzung für den Benutzer ein. Sie können den Benutzer zur Eingabe zusätzlicher Profilinformationen auffordern, die Sie benötigen, wenn Sie einen neu erstellten Benutzer in Ihrer App erkennen.

Sichern der Konten Ihrer Benutzer mit Cross Account Protection

Wenn Sie sich bei der Anmeldung eines Nutzers auf Google verlassen, profitieren Sie automatisch von allen Sicherheitsfunktionen und der Infrastruktur, die Google zum Schutz der Nutzerdaten entwickelt hat. In dem unwahrscheinlichen Fall, dass das Google-Konto des Nutzers kompromittiert wird oder ein anderes wichtiges Sicherheitsereignis vorliegt, kann Ihre App auch anfällig für Angriffe sein. Um Ihre Konten besser vor wichtigen Sicherheitsereignissen zu schützen, verwenden Sie Cross Account Protection , um Sicherheitswarnungen von Google zu erhalten. Wenn Sie diese Ereignisse erhalten, erhalten Sie Einblick in wichtige Änderungen der Sicherheit des Google-Kontos des Nutzers und können dann Maßnahmen für Ihren Dienst ergreifen, um Ihre Konten zu sichern.