警告:このデータは、 Googleユーザーデータポリシーに基づいて提供されています。ポリシーを確認して遵守してください。そうしないと、プロジェクトの停止またはアカウントの停止につながる可能性があります。

リンクされたアカウントのサインイン

Googleアカウントのリンクをシームレスかつ安全にGoogleとのサービスや共有データに接続し、迅速にGoogleアカウントの所有者を可能にします。

リンクされたアカウントサインインを有効にワンタップサインインをGoogleにすでにGoogleアカウントをお使いのサービスにリンクしているユーザーのために。これにより、ユーザー名とパスワードを再入力せずにワンクリックでサインインできるため、ユーザーのエクスペリエンスが向上します。また、ユーザーがサービスで重複するアカウントを作成する可能性も低くなります。

要件

リンクアカウントサインインを実装するには、次の要件を満たす必要があります。

使い方

前提条件:ユーザーは以前に自分のGoogleアカウントをサービスの自分のアカウントにリンクしている必要があります。

  1. ワンタップサインインフロー中にリンクされたアカウントを表示するようにオプトインします。
  2. リンクされたアカウントでサービスにサインインするオプションを含むワンタップサインインプロンプトがユーザーに表示されます。
  3. ユーザーがリンクされたアカウントを続行することを選択した場合、Googleは認証コードを保存するようにトークンエンドポイントにリクエストを送信します。リクエストには、サービスによって発行されたユーザーのアクセストークンとGoogle認証コードが含まれています。
  4. Google認証コードを、ユーザーのGoogleアカウントに関する情報を含むGoogleIDトークンと交換します。
  5. フローが終了すると、アプリはIDトークンも受け取ります。これを、サーバーが受け取ったIDトークンのユーザー識別子と照合して、ユーザーをアプリにサインインさせます。
リンクされたアカウントのサインイン。
図1.リンクされたアカウントサインインフロー。ユーザーがデバイスに複数のサインインアカウントを持っている場合、ユーザーにはアカウントチューザーが表示され、リンクされたアカウントを選択した場合にのみリンクされたアカウントのサインインビューが表示されます。

リンクされたアカウントのサインインをAndroidアプリに実装する

お使いのAndroidアプリにリンクされたアカウントサインインをサポートするために、の手順に従っAndroidの実装ガイドを

Googleからの認証コードリクエストを処理する

GoogleはトークンエンドポイントにPOSTリクエストを送信して、ユーザーのIDトークンと交換する認証コードを保存します。リクエストには、ユーザーのアクセストークンとGoogleが発行したOAuth2認証コードが含まれています。

認証コードを保存する前に、あなたはで識別Googleにあなたによって許可されたアクセストークン、確認する必要がありclient_id

HTTPリクエスト

サンプルリクエスト

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

トークン交換エンドポイントは、次のリクエストパラメータを処理できる必要があります。

トークンエンドポイントパラメーター
code必要なGoogleのOAuth2認証コード
client_id必要なクライアントIDは、Googleに発行されていること
client_secret Googleに発行することを必要なクライアント秘密
access_token必要なアクセスは、Googleに発行されたトークン。これを使用して、ユーザーのコンテキストを取得します
grant_type必要な値をに設定しなければならないurn:ietf:params:oauth:grant-type:reciprocal

トークン交換エンドポイントは、次の手順でPOSTリクエストに応答する必要があります。

  • 確認しaccess_tokenで識別Googleに付与されたclient_id
  • リクエストが有効で認証コードがGoogleIDトークンと正常に交換された場合はHTTP200(OK)応答で応答し、リクエストが無効な場合はHTTPエラーコードで応答します。

HTTP応答

成功

HTTPステータスコード200を返すOK

成功応答のサンプル
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

エラー

無効なHTTPリクエストが発生した場合は、次のHTTPエラーコードのいずれかで応答してください。

HTTPステータスコード説明
400 {"error": "invalid_request"}リクエストにパラメータがないため、サーバーはリクエストを続行できません。これは、リクエストにサポートされていないパラメータが含まれている場合、またはパラメータを繰り返す場合にも返される可能性があります
401 {"error": "invalid_request"}リクエストに無効なクライアントIDまたはシークレットが含まれている場合など、クライアント認証に失敗しました
401 {"error": "invalid_token"}

応答ヘッダーに「WWW-Authentication:Bearer」認証チャレンジを含めます

パートナーアクセストークンが無効です。
403 {"error": "insufficient_permission"}

応答ヘッダーに「WWW-Authentication:Bearer」認証チャレンジを含めます

パートナーアクセストークンに、相互OAuthを実行するために必要なスコープが含まれていません
500 {"error": "internal_error"}サーバーエラー

エラー応答には、次のフィールドが含まれている必要があります。

エラー応答フィールド
error必須のエラー文字列
error_descriptionエラーの人間が読める形式の説明
error_uriエラーに関する詳細を提供するURI
サンプルエラー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."
}

IDトークンの認証コードを交換する

受け取った認証コードを、ユーザーのGoogleアカウントに関する情報を含むGoogleIDトークンと交換する必要があります。

GoogleのIDトークンの承認コードを交換するには、呼び出しhttps://oauth2.googleapis.com/tokenエンドポイントと次のパラメータを設定します。

リクエストフィールド
client_id APIコンソールから取得したクライアントIDに必要な資格情報ページを。これは、一般的にはGoogle Appで名前の新しいアクションと資格になります
client_secret APIコンソールから取得したクライアントシークレット必要な資格情報ページを
code最初の要求で送信された認証コードを必要と
grant_type必要なOAuth 2.0の仕様で定義されているように、このフィールドの値に設定する必要がありますauthorization_code
サンプルリクエスト
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は、短期間のアクセストークンと更新トークンを含むJSONオブジェクトを返すことで、このリクエストに応答します。

応答には次のフィールドが含まれます。

応答フィールド
access_tokenアプリケーションがGoogleAPIリクエストを承認するために送信するGoogle発行のアクセストークン
id_token IDトークンには、ユーザーのGoogleアカウント情報が含まれています。認証応答セクションは、 IDトークン応答をデコードし、検証する方法の詳細が含まれています
expires_inアクセストークンの残りの有効期間(秒単位)
refresh_token新しいアクセストークンを取得するために使用できるトークン。更新トークンは、ユーザーがアクセスを取り消すまで有効です
scopeリンクされたアカウントのサインインユースケースでは、このフィールドの値は常にopenidに設定されます
token_type返されるトークンのタイプ。この時点では、このフィールドの値は常にに設定されているBearer
サンプル応答
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トークンの応答を検証します

JWTアサーションを検証してデコードします

言語のJWTデコードライブラリを使用して、JWTアサーションを検証およびデコードできますJWKまたはPEM形式で利用可能なGoogleの公開鍵を使用して、トークンの署名を確認します。

デコードすると、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が設定されている場合、これはemail_verifiedアカウントです。

ユーザーはGmailやGSuiteを使用せずにGoogleアカウントに登録できます。 email @gmail.comサフィックスが含まれておらず、 hdがない場合、Googleは信頼できません。ユーザーを確認するには、パスワードまたはその他のチャレンジ方法をお勧めします。 email_verfiedは、Googleアカウントが作成されたときにGoogleが最初にユーザーを確認したため、trueになることもありますが、サードパーティの電子メールアカウントの所有権が変更された可能性があります。