Anmeldung in einem verknüpften Konto

Die Google-Kontoverknüpfung ermöglicht es Google-Kontoinhabern, sich schnell, nahtlos und sicher mit Ihren Diensten zu verbinden und Daten mit Google zu teilen.

Die Funktion „Anmeldung mit verknüpften Konten“ aktiviert Über Google anmelden über One Tap für Nutzer, deren Google-Konto bereits mit Ihrem Dienst verknüpft ist. 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

Um die Anmeldung über ein verknüpftes Konto zu implementieren, müssen Sie die folgenden Anforderungen erfüllen:

  • Sie haben eine OAuth-Verknüpfungsimplementierung für ein Google-Konto, die den OAuth 2.0-Vorgang mit Autorisierungscode unterstützt. Deine OAuth-Implementierung muss die folgenden Endpunkte enthalten: <ph type="x-smartling-placeholder">
      </ph>
    • Autorisierungsendpunkt für die Verarbeitung von Autorisierungsanfragen.
    • Tokenendpunkt für die Verarbeitung der Anfrage für Zugriffs- und Aktualisierungstokens.
    • userinfo-Endpunkt, um grundlegende Kontoinformationen über den verknüpften Nutzer abzurufen, die dem Nutzer während der Anmeldung im verknüpften Konto angezeigt werden.
  • Sie haben eine Android-App.

Funktionsweise

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

  1. Sie können festlegen, dass verknüpfte Konten während der Anmeldung über One Tap angezeigt werden.
  2. Dem Nutzer wird eine Aufforderung zur Anmeldung über One Tap mit der Option angezeigt, sich mit seinem verknüpften Konto in 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 von Ihrem Dienst ausgestellte Zugriffstoken des Nutzers 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, und Sie gleichen dieses mit der Nutzer-ID im ID-Token ab, das von Ihrem Server empfangen wurde, um den Nutzer bei Ihrer App anzumelden.
<ph type="x-smartling-placeholder">
</ph> Anmeldung in einem verknüpften Konto. <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Anmeldevorgang in einem verknüpften Konto. Wenn der Nutzer auf seinem Gerät in mehreren Konten angemeldet ist, wird möglicherweise eine Kontoauswahl angezeigt und er wird nur zur Anmeldeansicht für verknüpfte Konten weitergeleitet, wenn er ein verknüpftes Konto auswählt.

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

Um die Anmeldung über ein verknüpftes Konto in Ihrer Android-App zu unterstützen, folgen Sie der Anleitung im Android-Implementierungsleitfaden.

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 das Zugriffstoken von Ihnen für Google erteilt wurde. Das Zugriffstoken erkennen Sie am client_id.

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 für Tokenendpunkt
code Erforderlich Google OAuth2-Autorisierungscode
client_id Erforderliche Client-ID, die Sie an Google vergeben haben
client_secret Erforderlicher Clientschlüssel, den Sie an Google ausgegeben haben
access_token Erforderliches Zugriffstoken, das Sie an Google ausgestellt haben. Damit erhalten Sie den Kontext des Nutzers
grant_type Erforderlich Der Wert MUSS auf urn:ietf:params:oauth:grant-type:reciprocal gesetzt sein.

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

  • Prüfen Sie, ob die access_token an Google von client_id gewährt wurde.
  • Antworten Sie mit einer HTTP 200-Antwort (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

Erfolg

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

Bei einer ungültigen HTTP-Anfrage kannst du mit einem der folgenden HTTP-Fehlercodes antworten:

HTTP-Statuscode Text Beschreibung
400 {"error": "invalid_request"} In der Anfrage fehlt ein Parameter, sodass der Server mit der Anfrage nicht fortfahren kann. Dieser wird möglicherweise auch zurückgegeben, 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 einen ungültigen Clientschlüssel enthält
401 {"error": "invalid_token"}

Geben Sie „WWW-Authentication: Bearer“ an. Auth-Abfrage im Antwortheader

Das Partner-Zugriffstoken ist ungültig.
403 {"error": "insufficient_permission"}

Geben Sie „WWW-Authentication: Bearer“ an. Auth-Abfrage im Antwortheader

Das Partner-Zugriffstoken enthält nicht die erforderlichen Bereiche zum Ausführen des wechselseitigen OAuths.
500 {"error": "internal_error"} Serverfehler

Die Fehlerantwort sollte die folgenden Felder enthalten :

Fehlerantwortfelder
error Erforderlich Fehlerstring
error_description Für Menschen lesbare Beschreibung des Fehlers
error_uri URI mit weiteren Details zum Fehler
Beispiel für eine Antwort von 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 für ID-Token austauschen

Sie müssen den Autorisierungscode, den Sie erhalten haben, gegen ein Google-ID-Token austauschen, 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 über die Seite "Anmeldedaten" der API Console abgerufen wurde. Das ist in der Regel das Ausweisdokument New Actions on Google App
client_secret Erforderlich. Der Clientschlüssel, der über die Seite „Anmeldedaten“ der API Console abgerufen wurde.
code Erforderlich. Der Autorisierungscode, der in der ursprünglichen Anfrage gesendet wurde
grant_type Erforderlich Gemäß der OAuth 2.0-Spezifikation muss der Wert in diesem Feld auf authorization_code festgelegt sein.
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 von Ihrer Anwendung gesendet wird, um eine Google API-Anfrage zu autorisieren
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 dieses Felds ist für den Anwendungsfall „Anmeldung in 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

Validieren Sie die ID-Token-Antwort

验证和解码 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 不 建议使用权威凭据和密码或其他验证方法进行验证 用户。email_verified 可能为 true,因为 Google 最初验证了 创建 Google 账号后,该用户会获得第三方的所有权, 后,电子邮件账号可能已更改。