Anmeldung in einem verknüpften Konto

Durch die Google-Kontoverknüpfung können Google-Kontoinhaber schnell, nahtlos und sicher eine Verbindung zu Ihren Diensten herstellen und Daten an Google weitergeben.

Die Anmeldung über ein verknüpftes Konto aktiviert Über Google mit One Tap anmelden für Nutzer, deren Google-Konto bereits mit Ihrem Dienst verknüpft ist. Dies erleichtert den Nutzern die Anmeldung, da sie sich mit nur einem Klick anmelden können, ohne ihren Nutzernamen und ihr Passwort noch einmal eingeben zu müssen. Außerdem verringert sich die Wahrscheinlichkeit, dass Nutzer doppelte Konten bei Ihrem Dienst erstellen.

Voraussetzungen

Wenn Sie die Anmeldung über verknüpfte Konten implementieren möchten, müssen Sie die folgenden Anforderungen erfüllen:

  • Sie haben eine Implementierung der OAuth-Verknüpfung Ihres Google-Kontos, 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 zum Abrufen grundlegender Kontoinformationen über den verknüpften Nutzer, 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 bei der Anmeldung mit One Tap angezeigt werden sollen.
  2. Dem Nutzer wird eine Aufforderung zur Anmeldung über One Tap mit der Option angezeigt, sich mit dem verknüpften Konto bei Ihrem Dienst anzumelden.
  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 erhält auch ein ID-Token, wenn der Vorgang abgeschlossen ist. Sie gleichen dieses mit der Nutzer-ID im ID-Token ab, das Ihr Server erhalten hat, um den Nutzer in Ihrer App anzumelden.
Anmeldung in einem verknüpften Konto.
Abbildung 1: Anmeldevorgang für verknüpfte Konten. Wenn der Nutzer auf seinem Gerät mehrere Konten hat, in denen er angemeldet ist, sieht er möglicherweise die Kontoauswahl und wird nur zur Ansicht „Anmeldung für verknüpftes Konto“ weitergeleitet, wenn er ein verknüpftes Konto auswählt.

Anmeldung über verknüpfte Konten in Ihrer Android-App implementieren

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

Autorisierungscodeanfragen von Google verarbeiten

Google sendet eine POST-Anfrage an den Tokenendpunkt, um einen Autorisierungscode zu speichern, den Sie dann 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 prüfen, ob das Zugriffstoken von Ihnen an Google gewährt wurde, das durch das client_id identifiziert wird.

HTTP-Request

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 für Tokenaustausch muss die folgenden Anfrageparameter verarbeiten können:

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

Der Endpunkt des Tokenaustauschs sollte auf die POST-Anfrage so reagieren:

  • Überprüfe, ob die access_token gewährt wurde, die Google durch die client_id identifiziert hat.
  • 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 wurde, oder mit einem HTTP-Fehlercode, wenn die Anfrage ungültig ist.

HTTP-Antwort

Abgeschlossen

HTTP-Statuscode 200 OK zurückgeben

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"} In der Anfrage fehlt ein Parameter, sodass der Server die Anfrage nicht fortsetzen kann. 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. wenn die Anfrage eine ungültige Client-ID oder ein ungültiges Secret enthält
401 {"error": "invalid_token"}

Die Authentifizierungsaufforderung „WWW-Authentication: Bearer“ in den Antwortheader aufnehmen

Das Zugriffstoken des Partners ist ungültig.
403 {"error": "insufficient_permission"}

Die Authentifizierungsaufforderung „WWW-Authentication: Bearer“ in den Antwortheader aufnehmen

Das Zugriffstoken des Partners 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 Menschenlesbare Beschreibung des Fehlers
error_uri URI mit weiteren Details zum Fehler
Beispiel für eine Fehlerantwort vom Typ 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. Das sind normalerweise die Anmeldedaten namens New 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 in der ersten Anfrage gesendete Autorisierungscode.
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 antwortet auf diese Anfrage, indem es ein JSON-Objekt zurückgibt, 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 abrufen 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

验证并解码JWT断言

您可以使用针对您的语言JWT解码库来验证和解码JWT断言。使用Google的JWKPEM格式的公钥来验证令牌的签名。

解码后,JWT断言类似于以下示例:

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

除了验证令牌的签名外,还要验证断言的颁发者( iss字段)为https://accounts.google.com ,受众( aud字段)是您分配的客户端ID,并且令牌尚未过期( exp场地)。

使用emailemail_verifiedhd字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。

Google具有权威性的情况:

  • email后缀为@gmail.com ,这是一个Gmail帐户。
  • email_verified为true并且设置了hd ,这是一个G Suite帐户。

用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email不包含@gmail.com后缀,并且没有hd则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。