Google アカウントのリンクを使用すると、Google アカウントの所有者は迅速かつシームレスに、安全にサービスに接続し、Google とデータを共有できます。
リンクされたアカウントのログインにより、すでに Google アカウントをサービスにリンクしているユーザーは、Google でワンタップでログインできるようになります。これにより、ユーザー名とパスワードを再入力しなくてもワンクリックでログインできるようになり、ユーザー エクスペリエンスが向上します。また、ユーザーがサービスに対して重複するアカウントを作成してしまう可能性も減ります。
要件
リンクされたアカウントのログインを実装するには、次の要件を満たす必要があります。
- OAuth 2.0 認可コードフローをサポートする Google アカウントの OAuth リンクを実装している。OAuth の実装には、次のエンドポイントを含める必要があります。
- 認可エンドポイントを使用して認可リクエストを処理します。
- アクセス トークンと更新トークンのリクエストを処理するトークン エンドポイント。
- userinfo エンドポイント: リンクされたユーザーに関する基本的なアカウント情報を取得します。この情報は、リンクされたアカウントのログイン処理中にユーザーに表示されます。
- Android アプリをお持ちです。
仕組み
前提条件 : ユーザーが事前に Google アカウントでサービス上の自分のアカウントとリンクしていること。
- ワンタップ ログインフロー中に、リンクされたアカウントを表示することを選択できます。
- ワンタップのログイン プロンプトがユーザーに表示され、リンクされたアカウントでサービスにログインするためのオプションが表示されます。
- ユーザーがリンクされたアカウントで続行することを選択した場合、Google は認可コードを保存するリクエストをトークン エンドポイントに送信します。リクエストには、サービスによって発行されたユーザーのアクセス トークンと Google の認証コードが含まれます。
- Google の認証コードを Google ID トークンと交換します。この ID トークンには、ユーザーの Google アカウントに関する情報が含まれています。
- フローが終了するとアプリは ID トークンも受け取ります。ユーザーをアプリにログインさせるために、サーバーで受け取った ID トークンのユーザー ID とこのトークンを照合します。
![リンクされたアカウントへのログイン。](https://developers.google.cn/static/identity/one-tap/android/images/linked-account-signin.png?authuser=6&hl=ja)
Android アプリにリンクされたアカウントのログインを実装する
Android アプリでリンクされたアカウントのログインをサポートするには、Android 実装ガイドの手順に沿ってください。
Google からの認証コード リクエストの処理
Google は、ユーザーの ID トークンと交換する認可コードを保存するために、トークン エンドポイントに POST リクエストを行います。リクエストには、ユーザーのアクセス トークンと 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 Status Code | 本文 | 説明 |
---|---|---|
400 | {"error": "invalid_request"} |
リクエストにパラメータがないため、サーバーはリクエストを処理できません。また、リクエストにサポートされていないパラメータが含まれている場合や、パラメータが繰り返されている場合にも返されることがあります。 |
401 | {"error": "invalid_request"} |
クライアント認証の失敗(リクエストに無効なクライアント ID またはシークレットが含まれているなど) |
401 | {"error": "invalid_token"}
レスポンス ヘッダーに「WWW-Authentication: Bearer」認証チャレンジを含める |
パートナーのアクセス トークンが無効です。 |
403 | {"error": "insufficient_permission"}
レスポンス ヘッダーに「WWW-Authentication: Bearer」認証チャレンジを含める |
パートナー アクセス トークンに、Reciprocal 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
ID トークンのレスポンスを検証する
JWT アサーションを検証してデコードする
JWT アサーションの検証とデコードは、 ご使用の言語に対応した JWT デコード ライブラリ。使用 Google の公開鍵は、Google Cloud で提供されている JWK または PEM 形式を使用しており、 トークンの署名。
デコードすると、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
が設定されています。これは G Suite アカウントです。
ユーザーは Gmail や G Suite を使用せずに Google アカウントを登録できます。日時
email
に @gmail.com
という接尾辞がなく、hd
が存在しない場合、Google には含まれません。
認証には、信頼できる認証方法、パスワード、その他の本人確認方法を使用することが推奨されます。
できます。email_verified
も、Google が最初に検証した
ユーザーに付与できますが、サードパーティの所有権が付与されます。
アカウントが変更された可能性があります。