Google アカウントのリンクを使用すると、Google アカウント所有者は、サービスに迅速かつシームレスに安全に接続し、Google とデータを共有できます。
リンク済みアカウント ログインを使用すると、サービスに Google アカウントをすでにリンクしているユーザーは Google でワンタップ サインインできます。これにより、ユーザー名とパスワードを再入力することなく、ワンクリックでログインできるため、ユーザー エクスペリエンスが向上します。また、ユーザーがサービスで重複するアカウントを作成する可能性も低くなります。
要件
リンクされたアカウントによるログインを実装するには、次の要件を満たす必要があります。
- OAuth 2.0 認可コードフローをサポートする Google アカウントの OAuth リンクを実装している。OAuth の実装には、次のエンドポイントを含める必要があります。
- 認可リクエストを処理する認可エンドポイント。
- アクセス トークンと更新トークンのリクエストを処理するトークン エンドポイント。
- userinfo エンドポイント: リンクされたユーザーに関する基本的なアカウント情報を取得します。この情報は、リンクされたアカウントのログイン プロセス中にユーザーに表示されます。
- Android アプリがある。
仕組み
前提条件 : ユーザーが、Google アカウントをサービス上のアカウントにリンク済みであること。
- ワンタップ ログイン フローで、リンク済みアカウントを表示するようにオプトインします。
- ユーザーに、リンクされたアカウントでサービスにログインするオプションを含むワンタップ ログイン プロンプトが表示されます。
- ユーザーがリンクされたアカウントで続行することを選択すると、Google はトークン エンドポイントにリクエストを送信して認可コードを保存します。このリクエストには、サービスによって発行されたユーザーのアクセス トークンと Google 認証コードが含まれます。
- Google 認可コードを、ユーザーの Google アカウントに関する情報が含まれる Google ID トークンと交換します。
- アプリはフロー完了時に ID トークンも受信します。この ID トークンを、サーバーが受信した ID トークンのユーザー ID と照合して、ユーザーをアプリにログインさせます。
![リンクされたアカウントでログインする。](https://developer.android.google.cn/static/identity/legacy/one-tap/images/linked-account-signin.png?hl=ja)
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