概要
OAuth ベースの Google ログインの簡素化されたリンクでは、Google ログインを OAuth リンクの上層に追加します。これにより、Google ユーザーはシームレスにリンクできるようになります。また、必要に応じてアカウント作成を有効にすることで、ユーザーは Google アカウントを使用してサービスで新しいアカウントを作成できます。
OAuth と Google ログインを使用してアカウント リンクを行うには、次の一般的な手順に従います。
- まず、ユーザーの Google プロフィールにアクセスすることについてユーザーに同意を求めます。
- プロフィールの情報を使用して、ユーザー アカウントが存在するかどうかを確認します。
- 既存のユーザーの場合は、アカウントをリンクします。
- 認証システムで Google ユーザーの一致が見つからない場合は、Google から受信した ID トークンを検証します。サービスがアカウント作成をサポートしている場合は、ID トークンに含まれているプロフィール情報に基づいてユーザー アカウントを作成できます。
図 1 。ユーザーのスマートフォンでの簡素化されたリンクによるアカウント リンク
簡素化されたリンク: OAuth + Google ログインフロー
次のシーケンス図は、簡素化されたリンクにおけるユーザー、Google、トークン交換エンドポイント間のインタラクションの詳細を示しています。
役割と責任
次の表に、簡素化されたリンクフローにおけるアクターの役割と責任を示します。
| アクター / コンポーネント | GAL ロール | 責任 |
|---|---|---|
| Google アプリ / サーバー | OAuth クライアント | Google ログインのユーザーの同意を取得し、ID アサーション (JWT)をサーバーに渡し、結果のトークンを安全に保存します。 |
| トークン交換エンドポイント | アイデンティティ プロバイダ / 認可サーバー | ID アサーションを検証し、既存のアカウントを確認し、必要なアカウント リンク インテント(check、get) とオプションの create インテントを処理し、リクエストされたインテントに基づいてトークンを発行します。 |
| サービス API | リソース サーバー | 有効なアクセス トークンが提示されたときに、ユーザーデータへのアクセスを提供します。 |
簡素化されたリンクの要件
- 基本的な OAuth リンクフローを実装します。サービスは、OAuth 2.0 準拠の認可エンドポイントとトークン交換エンドポイントをサポートしている必要があります。
- トークン交換エンドポイントは、
JSON ウェブトークン(JWT)
アサーションをサポートし、必要な
checkインテントとgetインテント、 および必要に応じてcreateインテントを実装する必要があります。
簡素化されたリンクの判断ロジック
次のロジックは、簡素化されたリンクフローでインテントが呼び出される方法を決定します。
- ユーザーは認証システムにアカウントを持っていますか?(ユーザーが [はい] または [いいえ] を選択して決定)
- [はい]: ユーザーは Google アカウントに関連付けられたメールアドレスを使用してプラットフォームにログインしますか?(ユーザーが [はい] または [いいえ] を選択して決定)
- [はい]: ユーザーは認証システムに一致するアカウントを持っていますか?(
checkインテント が呼び出されて確認されます)- [はい]:
getインテントが呼び出され、 get インテントが正常に返された場合はアカウントがリンクされます。 - [いいえ]: 新しいアカウントを作成しますか?(ユーザーが [はい] または [いいえ] を選択して決定します。サービスがアカウント作成をサポートしている場合にのみ適用されます)
- [はい]:
createインテントが呼び出され、create インテントが正常に返された場合はアカウントが リンクされます。 - [いいえ]: OAuth リンクフローがトリガーされ、ユーザーはブラウザにリダイレクトされ、別のメールアドレスでリンクするオプションが表示されます。
- [はい]:
- [はい]:
- [いいえ]: OAuth リンクフローがトリガーされ、ユーザー はブラウザにリダイレクトされ、別のメールアドレスで リンクするオプションが表示されます。
- [はい]: ユーザーは認証システムに一致するアカウントを持っていますか?(
- [いいえ]: ユーザーは認証システムに一致するアカウントを持っていますか?(
checkインテント が呼び出されて確認されます)- [はい]:
getインテントが呼び出され、get インテントが正常に返された場合はアカウントがリンクされます。 - [いいえ]: サービスがアカウント作成をサポートしている場合は、
createインテントが呼び出され、create インテントが正常に返された場合はアカウントがリンクされます。アカウント作成がサポートされていない場合、エンドポイントは HTTP 401 linking_error を返して、フォールバック OAuth リンクフローをトリガーする必要があります。
- [はい]:
- [はい]: ユーザーは Google アカウントに関連付けられたメールアドレスを使用してプラットフォームにログインしますか?(ユーザーが [はい] または [いいえ] を選択して決定)
実装レシピ
トークン交換エンドポイントは、簡素化されたリンクをサポートするために、必要な check インテントと get インテント、および必要に応じて create インテントを実装する必要があります。
さまざまなインテントを処理する手順は次のとおりです。
Check for an existing user account (check intent)
Google calls your token exchange endpoint to verify if the Google user exists in your system. For parameter details, see Streamlined Linking Intents.
Implementation Recipe
To handle the required check intent, perform the following actions:
Validate the request:
- Verify
client_id,client_secret, andgrant_type(must beurn:ietf:params:oauth:grant-type:jwt-bearer). - Validate the
assertion(JWT) using the criteria in JWT Validation.
- Verify
Lookup user:
- Check if the Google Account ID (
sub) or email address in the JWT matches a user in your database.
- Check if the Google Account ID (
Respond:
- If found: Return HTTP
200 OKwith{"account_found": "true"}. - If not found: Return HTTP
404 Not Foundwith{"account_found": "false"}.
- If found: Return HTTP
Handle automatic linking (get intent)
If the account exists, Google calls your endpoint with intent=get to retrieve
tokens. For parameter details, see Streamlined Linking
Intents.
Implementation Recipe
To handle the required get intent, perform the following actions:
Validate the request:
- Verify
client_id,client_secret, andgrant_type. - Validate the
assertion(JWT).
- Verify
Lookup user:
- Verify the user exists using the
suboremailclaim.
- Verify the user exists using the
Respond:
- If successful: Generate and return
access_token,refresh_token, andexpires_inin a JSON response (HTTP200 OK). - If linking fails: Return HTTP
401 Unauthorizedwith{"error": "linking_error"}and an optionallogin_hintto fall back to standard OAuth linking.
- If successful: Generate and return
Google でログインを使用したアカウント作成を処理する(create インテント)
サービスがアカウント作成をサポートしていて、アカウントが存在しない場合、Google は intent=create を使用してエンドポイントを呼び出し、新しいユーザーを作成します。パラメータの詳細については、
簡素化されたリンク
のインテントをご覧ください。
実装レシピ
省略可能な create インテントを処理するには、次の操作を行います。
リクエストを検証する:
client_id、client_secret、grant_typeを確認します。assertion(JWT)を検証します。
ユーザーが存在しないことを確認する:
subまたはemailがデータベースにすでに存在するかどうかを確認します。- ユーザーが存在する場合、OAuth リンクへのフォールバックを強制するために、
{"error": "linking_error", "login_hint": "USER_EMAIL"}を含む HTTP401 Unauthorizedを返します。
アカウントを作成する:
- JWT の
sub、email、name、pictureクレームを使用して、新しいユーザー レコードを作成します。
- JWT の
応答する:
- JSON レスポンス(HTTP
200 OK)でトークンを生成して返します。
- JSON レスポンス(HTTP
Google API クライアント ID を取得する
アカウント リンク 登録プロセスでは、Google API クライアント ID を指定する必要があります。OAuth リンクの手順を完了する際に作成したプロジェクトを使用して API クライアント ID を取得するには、次の手順を完了します。
- [クライアント] ページに移動します。
Google API プロジェクトを作成または選択します。
プロジェクトにウェブ アプリケーション タイプのクライアント ID がない場合は、[クライアントを作成] をクリックして作成します。[承認済みの JavaScript 生成元] ボックスにサイトのドメインを含めるようにしてください。ローカル テストまたは 開発を行う場合は、
http://localhostとhttp://localhost:<port_number>の両方を [承認済みの JavaScript 生成元] フィールドに追加する必要があります。
実装を検証する
You can validate your implementation by using the OAuth 2.0 Playground tool.
In the tool, do the following steps:
- Click Configuration to open the OAuth 2.0 Configuration window.
- In the OAuth flow field, select Client-side.
- In the OAuth Endpoints field, select Custom.
- Specify your OAuth 2.0 endpoint and the client ID you assigned to Google in the corresponding fields.
- In the Step 1 section, don't select any Google scopes. Instead, leave this field blank or type a scope valid for your server (or an arbitrary string if you don't use OAuth scopes). When you're done, click Authorize APIs.
- In the Step 2 and Step 3 sections, go through the OAuth 2.0 flow and verify that each step works as intended.
You can validate your implementation by using the Google Account Linking Demo tool.
In the tool, do the following steps:
- Click the Sign in with Google button.
- Choose the account you'd like to link.
- Enter the service ID.
- Optionally enter one or more scopes that you will request access for.
- Click Start Demo.
- When prompted, confirm that you may consent and deny the linking request.
- Confirm that you are redirected to your platform.