Mit einem Back-End-Server authentifizieren

Wenn du Google Log-in für eine App oder Website verwendest, die mit einem Backend-Server kommuniziert, musst du 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 deinen Server senden

Rufe zuerst das ID-Token ab, wenn sich der Nutzer anmeldet:

  1. Wenn Sie Google Log-in konfigurieren, rufen Sie die Methode requestIdToken auf und übergeben Sie die Web-Client-ID Ihres Servers.

    // Request only the user's ID token, which can be used to identify the
    // user securely to your backend. This will contain the user's basic
    // profile (name, profile picture URL, etc) so you should not need to
    // make an additional call to personalize your application.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.server_client_id))
            .requestEmail()
            .build();
  2. Prüfen Sie beim Starten Ihrer App, ob sich der Nutzer bereits über Google auf diesem oder einem anderen Gerät in Ihrer App angemeldet hat. Rufen Sie dazu silentSignIn auf:

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
  3. Wenn der Nutzer sich nicht ohne Ihr Wissen anmelden kann, zeigen Sie die normale, abgemeldete Person an. und dem Nutzer die Möglichkeit geben, sich anzumelden. Wenn Nutzende Zeichen in: Rufen Sie die GoogleSignInAccount des Nutzers in der Aktivität ab. Ergebnis des Anmelde-Intents:

    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
  4. Nachdem sich der Nutzer automatisch oder explizit angemeldet hat, rufe das ID-Token aus dem GoogleSignInAccount-Objekt ab:

    private void handleSignInResult(@NonNull Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            String idToken = account.getIdToken();
    
            // TODO(developer): send ID Token to server and validate
    
            updateUI(account);
        } catch (ApiException e) {
            Log.w(TAG, "handleSignInResult:error", e);
            updateUI(null);
        }
    }

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

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

try {
  List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
  nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
  httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

  HttpResponse response = httpClient.execute(httpPost);
  int statusCode = response.getStatusLine().getStatusCode();
  final String responseBody = EntityUtils.toString(response.getEntity());
  Log.i(TAG, "Signed in as: " + responseBody);
} catch (ClientProtocolException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
} catch (IOException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
}

Integrität des ID-Tokens prüfen

Nachdem du das ID-Token per HTTPS POST erhalten hast, musst du die Integrität des Tokens prüfen.

So prüfen Sie, ob das Token gültig ist:

  • Das ID-Token ist von Google ordnungsgemäß signiert. Verwenden Sie die öffentlichen Schlüssel von Google (im JWK- oder PEM-Format), um die Signatur des Tokens zu prüfen. Diese Schlüssel werden regelmäßig rotiert. Sehen Sie sich den Cache-Control-Header in der Antwort an, um zu ermitteln, wann Sie sie wieder abrufen sollten.
  • Der Wert von aud im ID-Token entspricht einer der Client-IDs Ihrer App. Diese Prüfung ist erforderlich, um zu verhindern, dass ID-Tokens, die für eine schädliche App ausgestellt wurden, für den Zugriff auf Daten desselben Nutzers auf dem Backend-Server Ihrer App verwendet werden.
  • Der Wert von iss im ID-Token entspricht accounts.google.com oder https://accounts.google.com.
  • Die Ablaufzeit (exp) des ID-Tokens ist noch nicht erreicht.
  • Wenn Sie bestätigen müssen, dass das ID-Token ein Google Workspace- oder Cloud Identity-Organisationskonto darstellt, können Sie den Anspruch hd prüfen, der die gehostete Domain des Nutzers angibt. Dies muss verwendet werden, wenn der Zugriff auf eine Ressource auf Mitglieder bestimmter Domains beschränkt wird. Wenn diese Behauptung fehlt, gehört das Konto nicht zu einer von Google gehosteten Domain.

Mithilfe der Felder email, email_verified und hd können Sie ermitteln, ob Google eine E-Mail-Adresse hostet und autoritativ für sie ist. In den Fällen, in denen Google maßgeblich ist, ist der Nutzer als rechtmäßiger Kontoinhaber bekannt und Sie können das Passwort oder andere Bestätigungsmethoden überspringen.

Fälle, in denen Google maßgebend ist:

  • Wenn die E‑Mail-Adresse von email mit @gmail.com endet, handelt es sich um ein Gmail-Konto.
  • Wenn email_verified wahr ist und hd festgelegt ist, handelt es sich um ein Google Workspace-Konto.

Nutzer können sich für Google-Konten registrieren, ohne Gmail oder Google Workspace zu verwenden. Wenn email kein Suffix @gmail.com enthält und hd fehlt, ist Google nicht autoritativ und es wird empfohlen, das Passwort oder andere Challenge-Methoden zu verwenden, um den Nutzer zu bestätigen. email_verified kann auch zutreffen, da Google den Nutzer bei der Erstellung des Google-Kontos ursprünglich bestätigt hat. Die Inhaberschaft des E-Mail-Kontos des Drittanbieters kann sich jedoch inzwischen geändert haben.

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

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 WEB_CLIENT_ID of the app that accesses the backend:
    .setAudience(Collections.singletonList(WEB_CLIENT_ID))
    // Or, if multiple clients access the backend:
    //.setAudience(Arrays.asList(WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_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: WEB_CLIENT_ID,  // Specify the WEB_CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_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' => $WEB_CLIENT_ID]);  // Specify the WEB_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 überprüfen, die angibt, Domain des Nutzers. Muss verwendet werden, wenn der Zugriff auf eine Ressource auf Mitglieder beschränkt wird bestimmter 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 WEB_CLIENT_ID of the app that accesses the backend:
    idinfo = id_token.verify_oauth2_token(token, requests.Request(), WEB_CLIENT_ID)

    # Or, if multiple clients access the backend server:
    # idinfo = id_token.verify_oauth2_token(token, requests.Request())
    # if idinfo['aud'] not in [WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_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.

Tokeninfo-Endpunkt aufrufen

Eine einfache Möglichkeit, die Signatur eines ID-Tokens für die Fehlerbehebung zu validieren, besteht darin, Verwenden Sie den Endpunkt tokeninfo. Zum Aufrufen dieses Endpunkts ist ein zusätzliche Netzwerkanfrage, die die Validierung für Sie übernimmt, während Sie Validierung und Nutzlastextraktion in Ihrem eigenen Code. Es ist nicht für die Verwendung in der Produktion geeignet. da Anfragen gedrosselt werden oder anderweitig zu zeitweiligen Fehlern führen können.

Erstellen Sie ein HTTPS, um ein ID-Token mit dem Endpunkt tokeninfo zu validieren POST- oder GET-Anfrage an den Endpunkt und übergeben Sie Ihr ID-Token in der id_token-Parameter. Um beispielsweise das Token „XYZ123“ zu validieren, stellen Sie die folgende GET-Anfrage:

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

Wenn das Token ordnungsgemäß signiert ist und iss und exp Anforderungen die erwarteten Werte aufweisen, erhalten Sie eine HTTP 200-Antwort, in der der Text enthält die ID-Token-Anforderungen im JSON-Format. Sie sehen hier ein Beispiel:

{
 // 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 überprüfen möchten, ob das ID-Token für ein Google Workspace-Konto steht, können Sie Die hd-Anforderung, die die gehostete Domain des Nutzers angibt. Muss verwendet werden, wenn Sie können den Zugriff auf eine Ressource auf Mitglieder bestimmter Domains beschränken. Das Fehlen dieses Anspruchs gibt an, dass das Konto nicht zu einer von Google Workspace gehosteten Domain gehört.

Konto oder Sitzung erstellen

Nachdem du das Token überprüft hast, prüfe, ob der Nutzer bereits in deiner Nutzerdatenbank vorhanden ist. Wenn ja, richte eine authentifizierte Sitzung für den Nutzer ein. Wenn der Nutzer noch nicht in Ihrer Nutzerdatenbank vorhanden ist, erstellen Sie einen neuen Nutzereintrag anhand der Informationen in der ID-Token-Nutzlast und richten Sie 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 die Anmeldung eines Nutzers über Google vornehmen, profitieren Sie automatisch von allen Sicherheitsfunktionen und der Infrastruktur, die Google zum Schutz der Daten des Nutzers entwickelt hat. Sollte das Google-Konto des Nutzers jedoch gehackt werden oder es zu einem anderen schwerwiegenden Sicherheitsereignis kommen, ist Ihre App anfällig für Angriffe. Wenn Sie Ihre Konten besser vor größeren Sicherheitsvorfällen schützen möchten, können Sie den kontoübergreifenden Schutz aktivieren, 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.