Google アカウントのリンクを使用すると、Google アカウント所有者は、サービスに迅速かつシームレスに安全に接続し、Google とデータを共有できます。
リンク済みアカウント ログインを使用すると、サービスに Google アカウントをすでにリンクしているユーザーは Google でワンタップ サインインできます。これにより、ユーザー名とパスワードを再入力することなく、ワンクリックでログインできるため、ユーザー エクスペリエンスが向上します。また、ユーザーがサービスで重複するアカウントを作成する可能性も低くなります。
要件
リンクされたアカウントによるログインを実装するには、次の要件を満たす必要があります。
- OAuth 2.0 認可コードフローをサポートする Google アカウントの OAuth リンクを実装している。OAuth の実装には、次のエンドポイントを含める必要があります。
- 認可リクエストを処理する認可エンドポイント。
- アクセス トークンと更新トークンのリクエストを処理するトークン エンドポイント。
- userinfo エンドポイント: リンクされたユーザーに関する基本的なアカウント情報を取得します。この情報は、リンクされたアカウントのログイン プロセス中にユーザーに表示されます。
- Android アプリがある。
仕組み
前提条件 : ユーザーが、Google アカウントをサービス上のアカウントにリンク済みであること。
- ワンタップ ログイン フローで、リンク済みアカウントを表示するようにオプトインします。
- ユーザーに、リンクされたアカウントでサービスにログインするオプションを含むワンタップ ログイン プロンプトが表示されます。
- ユーザーがリンクされたアカウントで続行することを選択すると、Google はトークン エンドポイントにリクエストを送信して認可コードを保存します。このリクエストには、サービスによって発行されたユーザーのアクセス トークンと Google 認証コードが含まれます。
- Google 認可コードを、ユーザーの Google アカウントに関する情報が含まれる Google ID トークンと交換します。
- アプリはフロー完了時に ID トークンも受信します。この ID トークンを、サーバーが受信した 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 |
必須 Google に対して発行したクライアント ID |
client_secret |
必須 Google に発行したクライアント シークレット |
access_token |
必須 Google に発行したアクセス トークン。これを使用して、ユーザーのコンテキストを取得します。 |
grant_type |
必須 値は urn:ietf:params:oauth:grant-type:reciprocal に設定する必要があります |
トークン交換エンドポイントは、次の処理を行って POST リクエストに応答する必要があります。
access_token
がclient_id
で識別される Google に付与されていることを確認します。- リクエストが有効で、認証コードが Google ID トークンと正常に交換された場合は HTTP 200(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 アカウントに関する情報を含む Google ID トークンと交換する必要があります。
認可コードを Google ID トークンと交換するには、https://oauth2.googleapis.com/token
エンドポイントを呼び出して、次のパラメータを設定します。
リクエスト フィールド | |
---|---|
client_id |
必須 API Console の [認証情報] ページで取得したクライアント ID。通常は、New Actions on Google App という名前の認証情報になります。 |
client_secret |
必須 API Console の [認証情報] ページで取得したクライアント シークレット |
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 |
Google が発行したアクセス トークン。アプリケーションが Google API リクエストを承認するために送信します。 |
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