Googleアカウントのリンクをシームレスかつ安全にGoogleとのサービスや共有データに接続し、迅速にGoogleアカウントの所有者を可能にします。
リンクされたアカウントサインインを有効にワンタップサインインをGoogleにすでにGoogleアカウントをお使いのサービスにリンクしているユーザーのために。これにより、ユーザー名とパスワードを再入力せずにワンクリックでサインインできるため、ユーザーのエクスペリエンスが向上します。また、ユーザーがサービスで重複するアカウントを作成する可能性も低くなります。
要件
リンクアカウントサインインを実装するには、次の要件を満たす必要があります。
- あなたは持っているGoogleアカウントのOAuthのリンクのOAuth 2.0の認証コードの流れをサポートする実装を。 OAuth実装には、次のエンドポイントを含める必要があります。
- 認可エンドポイントハンドル承認要求へ。
- トークンエンドポイントへのアクセスとリフレッシュトークンの要求を処理します。
- エンドポイントのUserInfoリンクされたアカウントサインインプロセス中にユーザに表示されるリンクされたユーザーに関する基本的なアカウント情報を取得します。
- あなたはAndroidアプリを持っています。
使い方
前提条件:ユーザーは以前に自分のGoogleアカウントをサービスの自分のアカウントにリンクしている必要があります。
- ワンタップサインインフロー中にリンクされたアカウントを表示するようにオプトインします。
- リンクされたアカウントでサービスにサインインするオプションを含むワンタップサインインプロンプトがユーザーに表示されます。
- ユーザーがリンクされたアカウントを続行することを選択した場合、Googleは認証コードを保存するようにトークンエンドポイントにリクエストを送信します。リクエストには、サービスによって発行されたユーザーのアクセストークンとGoogle認証コードが含まれています。
- Google認証コードを、ユーザーのGoogleアカウントに関する情報を含むGoogleIDトークンと交換します。
- フローが終了すると、アプリはIDトークンも受け取ります。これを、サーバーが受け取ったIDトークンのユーザー識別子と照合して、ユーザーをアプリにサインインさせます。

リンクされたアカウントのサインインを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
フィールド)。
email
、 email_verified
、 hd
フィールドを使用して、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になることもありますが、サードパーティの電子メールアカウントの所有権が変更された可能性があります。