Anmeldung in einem verknüpften Konto

Mit der Google-Kontoverknüpfung können Google-Kontoinhaber schnell, nahtlos und sicher eine Verbindung zu Ihren Diensten herstellen und Daten mit Google teilen.

Die Anmeldung über ein verknüpftes Konto ermöglicht Nutzern, die ihr Google-Konto bereits mit Ihrem Dienst verknüpft haben, die Funktion Über Google mit nur einmal tippen. So können sich die Nutzer mit nur einem Klick anmelden, ohne ihren Nutzernamen und ihr Passwort noch einmal eingeben zu müssen. Außerdem verringert sich dadurch die Wahrscheinlichkeit, dass Nutzer doppelte Konten in Ihrem Dienst erstellen.

Voraussetzungen

Wenn Sie die Anmeldung über ein verknüpftes Konto implementieren möchten, müssen Sie die folgenden Voraussetzungen erfüllen:

  • Sie haben eine Implementierung der OAuth-Verknüpfung für Google-Konten, die den OAuth 2.0-Vorgang mit Autorisierungscode unterstützt. Ihre OAuth-Implementierung muss die folgenden Endpunkte enthalten:
    • Autorisierungsendpunkt zur Verarbeitung von Autorisierungsanfragen.
    • Tokenendpunkt, um die Anfrage für Zugriffs- und Aktualisierungstokens zu verarbeiten.
    • userinfo-Endpunkt, um grundlegende Kontoinformationen über den verknüpften Nutzer abzurufen, die dem Nutzer bei der Anmeldung in einem verknüpften Konto angezeigt werden.
  • Sie haben eine Android-App.

Funktionsweise

Voraussetzung : Der Nutzer hat sein Google-Konto zuvor mit seinem Konto bei Ihrem Dienst verknüpft.

  1. Sie stimmen zu, dass verknüpfte Konten während der Anmeldung über One Tap angezeigt werden.
  2. Dem Nutzer wird eine Aufforderung zur Anmeldung über One Tap angezeigt, mit der er sich mit dem verknüpften Konto bei Ihrem Dienst anmelden kann.
  3. Wenn der Nutzer mit dem verknüpften Konto fortfahren möchte, sendet Google eine Anfrage zum Speichern eines Autorisierungscodes an Ihren Tokenendpunkt. Die Anfrage enthält das Zugriffstoken des Nutzers, das von Ihrem Dienst ausgestellt wurde, sowie einen Google-Autorisierungscode.
  4. Sie tauschen den Google-Autorisierungscode gegen ein Google-ID-Token aus, das Informationen zum Google-Konto des Nutzers enthält.
  5. Ihre App empfängt auch ein ID-Token, wenn der Vorgang abgeschlossen ist. Sie gleichen dieses mit der Nutzer-ID im ID-Token ab, das Ihr Server empfangen hat, um den Nutzer in Ihrer App anzumelden.
Anmeldung in einem verknüpften Konto.
Abbildung 1: Anmeldevorgang bei einem verknüpften Konto. Wenn der Nutzer auf seinem Gerät mehrere Konten hat, auf denen er angemeldet ist, wird ihm möglicherweise die Kontoauswahl angezeigt. Er wird nur dann zur Anmeldeansicht für verknüpfte Konten weitergeleitet, wenn er ein verknüpftes Konto auswählt.

Die Anmeldung über ein verknüpftes Konto in der Android-App implementieren

Wenn Sie die Anmeldung über verknüpfte Konten in Ihrer Android-App unterstützen möchten, folgen Sie der Anleitung im Implementierungsleitfaden für Android.

Autorisierungscodeanfragen von Google verarbeiten

Google sendet eine POST-Anfrage an Ihren Tokenendpunkt, um einen Autorisierungscode zu speichern, den Sie gegen das ID-Token des Nutzers austauschen. Die Anfrage enthält das Zugriffstoken des Nutzers und einen von Google ausgestellten OAuth2-Autorisierungscode.

Bevor Sie den Autorisierungscode speichern, müssen Sie bestätigen, dass Sie Google das Zugriffstoken gewährt haben, das durch die client_id identifiziert wird.

HTTP-Anfrage

Beispielanfrage

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

Der Endpunkt des Tokenaustauschs muss die folgenden Anfrageparameter verarbeiten können:

Parameter des Tokenendpunkts
code Erforderlich Google OAuth2-Autorisierungscode
client_id Erforderlich Client-ID, die Sie Google ausgestellt haben
client_secret Erforderlich Clientschlüssel, den Sie an Google ausgegeben haben
access_token Erforderlich Zugriffstoken, das Sie Google ausgestellt haben. Damit können Sie den Kontext der Nutzenden
grant_type Erforderlich. Der Wert MUSS auf urn:ietf:params:oauth:grant-type:reciprocal festgelegt sein.

Der Endpunkt des Tokenaustauschs sollte folgendermaßen auf die POST-Anfrage reagieren:

  • Prüfen Sie, ob die access_token gewährt wurde, die von client_id identifiziert wurde.
  • Sie antworten entweder mit der HTTP-Antwort 200 (OK), wenn die Anfrage gültig ist und der Autorisierungscode erfolgreich gegen ein Google-ID-Token ausgetauscht wird, oder mit einem HTTP-Fehlercode, wenn die Anfrage ungültig ist.

HTTP-Antwort

Abgeschlossen

Rückgabe des HTTP-Statuscodes 200 OK

Beispiel für eine erfolgreiche Antwort
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Fehler

Im Falle einer ungültigen HTTP-Anfrage antworten Sie mit einem der folgenden HTTP-Fehlercodes:

HTTP-Statuscode Text Beschreibung
400 {"error": "invalid_request"} Da in der Anfrage ein Parameter fehlt, kann der Server die Anfrage nicht fortsetzen. Dieser Fehler kann auch zurückgegeben werden, wenn die Anfrage einen nicht unterstützten Parameter enthält oder einen Parameter wiederholt.
401 {"error": "invalid_request"} Clientauthentifizierung fehlgeschlagen, z. B. weil die Anfrage eine ungültige Client-ID oder ein ungültiges Secret enthält
401 {"error": "invalid_token"}

Fügen Sie die Authentifizierungsaufforderung „WWW-Authentication: Bearer“ in den Antwortheader ein.

Das Zugriffstoken für den Partner ist ungültig.
403 {"error": "insufficient_permission"}

Fügen Sie die Authentifizierungsaufforderung „WWW-Authentication: Bearer“ in den Antwortheader ein.

Das Partner-Zugriffstoken enthält nicht die erforderlichen Bereiche, um das gegenseitige OAuth auszuführen
500 {"error": "internal_error"} Serverfehler

Die Fehlerantwort sollte die folgenden Felder enthalten :

Felder für Fehlerantwort
error Erforderlich Fehlerstring
error_description Für Menschen lesbare Beschreibung des Fehlers
error_uri URI mit weiteren Details zum Fehler
Beispiel für eine Fehlerantwort des Typs „Fehler 400“
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Autorisierungscode gegen ID-Token austauschen

Tauschen Sie den erhaltenen Autorisierungscode gegen ein Google-ID-Token aus, das Informationen zum Google-Konto des Nutzers enthält.

Wenn Sie einen Autorisierungscode gegen ein Google-ID-Token austauschen möchten, rufen Sie den Endpunkt https://oauth2.googleapis.com/token auf und legen Sie die folgenden Parameter fest:

Anfragefelder
client_id Erforderlich. Die Client-ID, die Sie der API Console auf der Seite „Anmeldedaten“ erhalten haben. In der Regel handelt es sich dabei um die Anmeldedaten mit dem Namen New Actions on Google App (Neue Actions on Google-App).
client_secret Erforderlich. Der Clientschlüssel, den Sie in der API Console auf der Seite „Anmeldedaten“ erhalten haben.
code Erforderlich. Der Autorisierungscode, der in der ersten Anfrage gesendet wurde.
grant_type Erforderlich Wie in der OAuth 2.0-Spezifikation definiert, muss der Wert dieses Felds auf authorization_code festgelegt werden.
Beispielanfrage
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

Google reagiert auf diese Anfrage mit der Rückgabe eines JSON-Objekts, das ein kurzlebiges Zugriffstoken und ein Aktualisierungstoken enthält.

Die Antwort umfasst die folgenden Felder:

Antwortfelder
access_token Von Google ausgestelltes Zugriffstoken, das Ihre Anwendung zum Autorisieren einer Google API-Anfrage sendet
id_token Das ID-Token enthält die Google-Kontoinformationen des Nutzers. Der Abschnitt Antwort validieren enthält Details zum Decodieren und Validieren der ID-Token-Antwort.
expires_in Die verbleibende Lebensdauer des Zugriffstokens in Sekunden
refresh_token Ein Token, mit dem Sie ein neues Zugriffstoken erhalten können. Aktualisierungstokens sind gültig, bis der Nutzer den Zugriff widerruft
scope Der Wert in diesem Feld ist für den Anwendungsfall „Anmeldung mit einem verknüpften Konto“ immer auf „openid“ festgelegt
token_type Der Typ des zurückgegebenen Tokens. Derzeit ist der Wert dieses Felds immer auf Bearer festgelegt.
Beispielantwort
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

ID-Token-Antwort validieren

Überprüfen und dekodieren Sie die JWT-Zusicherung

Sie können die JWT-Zusicherung validieren und decodieren, indem Sie eine JWT-Decodierungsbibliothek für Ihre Sprache verwenden . Verwenden Sie die öffentlichen Schlüssel von Google, die in den Formaten JWK oder PEM verfügbar sind, um die Signatur des Tokens zu überprüfen.

Beim Dekodieren sieht die JWT-Zusicherung wie folgt aus:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Stellen Sie neben der Überprüfung der Signatur des Tokens sicher, dass der Aussteller der Assertion (Feld iss ) https://accounts.google.com , dass die Zielgruppe (Feld aud ) Ihre zugewiesene Client-ID ist und das Token nicht abgelaufen ist ( exp Feld).

Anhand der Felder email , email_verified und hd können Sie feststellen, ob Google eine E-Mail-Adresse hostet und für diese maßgeblich ist. In Fällen, in denen Google autorisierend ist, ist der Nutzer derzeit als legitimer Kontoinhaber bekannt, und Sie können das Passwort oder andere Herausforderungsmethoden überspringen. Andernfalls können diese Methoden verwendet werden, um das Konto vor dem Verknüpfen zu überprüfen.

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

  • email hat @gmail.com Suffix @gmail.com . Dies ist ein Google Mail-Konto.
  • email_verified ist true und hd ist festgelegt. Dies ist ein G Suite-Konto.

Benutzer können sich für Google-Konten registrieren, ohne Google Mail oder G Suite zu verwenden. Wenn email kein @gmail.com Suffix enthalten und hd fehlt, ist Google nicht autorisierend. Zur Überprüfung des Benutzers werden Kennwörter oder andere @gmail.com empfohlen. email_verfied kann auch wahr sein, da Google den Nutzer bei der email_verfied des Google-Kontos zunächst überprüft hat. Der Besitz des E-Mail-Kontos eines Drittanbieters hat sich jedoch möglicherweise seitdem geändert.