OAuth と Google でログインによるリンクの簡素化

概要

OAuth ベースの Google ログインの簡素化されたリンクでは、Google ログインを OAuth リンクの上層に追加します。これにより、Google ユーザーはシームレスにリンクできるようになります。また、必要に応じてアカウント作成を有効にすることで、ユーザーは Google アカウントを使用してサービスで新しいアカウントを作成できます。

OAuth と Google ログインを使用してアカウント リンクを行うには、次の一般的な手順に従います。

  1. まず、ユーザーの Google プロフィールにアクセスすることについてユーザーに同意を求めます。
  2. プロフィールの情報を使用して、ユーザー アカウントが存在するかどうかを確認します。
  3. 既存のユーザーの場合は、アカウントをリンクします。
  4. 認証システムで Google ユーザーの一致が見つからない場合は、Google から受信した ID トークンを検証します。サービスがアカウント作成をサポートしている場合は、ID トークンに含まれているプロフィール情報に基づいてユーザー アカウントを作成できます。
この図は、ユーザーが簡素化されたリンクフローを使用して Google アカウントをリンクする手順を示しています。最初のスクリーンショットは、ユーザーがリンクするアプリをどのように選択できるかを示します。2 つ目のスクリーンショットでは、ユーザーがサービスに既存のアカウントがあるかどうかを確認できます。3 番目のスクリーンショットでは、リンクする Google アカウントを選択できます。4 番目のスクリーンショットは、ユーザーの Google アカウントをアプリにリンクするための確認画面を示します。5 番目のスクリーンショットは、Google アプリでユーザー アカウントが正常にリンクされたことを示しています。
ユーザーのスマートフォンでの簡素化されたリンクによるアカウント リンク

図 1 。ユーザーのスマートフォンでの簡素化されたリンクによるアカウント リンク

簡素化されたリンク: OAuth + Google ログインフロー

次のシーケンス図は、簡素化されたリンクにおけるユーザー、Google、トークン交換エンドポイント間のインタラクションの詳細を示しています。

ユーザー Google アプリ / サーバー トークン 交換エンドポイント API 1. ユーザーがリンクを開始 2. Google ログインをリクエスト 3. Google ログイン 4\. インテントを確認(JWT アサーション) 5\. account_found: true/false アカウントが見つかった場合: 6\. インテントを取得 アカウントがない場合: 6\. インテントを作成 7\. access_token, refresh_token 8\.ユーザー トークンを保存 9. ユーザー リソースにアクセス
図 2.簡素化されたリンクフローでのイベントのシーケンス。

役割と責任

次の表に、簡素化されたリンクフローにおけるアクターの役割と責任を示します。

アクター / コンポーネント GAL ロール 責任
Google アプリ / サーバー OAuth クライアント Google ログインのユーザーの同意を取得し、ID アサーション (JWT)をサーバーに渡し、結果のトークンを安全に保存します。
トークン交換エンドポイント アイデンティティ プロバイダ / 認可サーバー ID アサーションを検証し、既存のアカウントを確認し、必要なアカウント リンク インテント(check、get) とオプションの create インテントを処理し、リクエストされたインテントに基づいてトークンを発行します。
サービス API リソース サーバー 有効なアクセス トークンが提示されたときに、ユーザーデータへのアクセスを提供します。

簡素化されたリンクの要件

  • 基本的な OAuth リンクフローを実装します。サービスは、OAuth 2.0 準拠の認可エンドポイントとトークン交換エンドポイントをサポートしている必要があります。
  • トークン交換エンドポイントは、 JSON ウェブトークン(JWT) アサーションをサポートし、必要な check インテントと get インテント、 および必要に応じて create インテントを実装する必要があります。

簡素化されたリンクの判断ロジック

次のロジックは、簡素化されたリンクフローでインテントが呼び出される方法を決定します。

  1. ユーザーは認証システムにアカウントを持っていますか?(ユーザーが [はい] または [いいえ] を選択して決定)
    1. [はい]: ユーザーは Google アカウントに関連付けられたメールアドレスを使用してプラットフォームにログインしますか?(ユーザーが [はい] または [いいえ] を選択して決定)
      1. [はい]: ユーザーは認証システムに一致するアカウントを持っていますか?(check インテント が呼び出されて確認されます)
        1. [はい]: get インテントが呼び出され、 get インテントが正常に返された場合はアカウントがリンクされます。
        2. [いいえ]: 新しいアカウントを作成しますか?(ユーザーが [はい] または [いいえ] を選択して決定します。サービスがアカウント作成をサポートしている場合にのみ適用されます)
          1. [はい]: create インテントが呼び出され、create インテントが正常に返された場合はアカウントが リンクされます。
          2. [いいえ]: OAuth リンクフローがトリガーされ、ユーザーはブラウザにリダイレクトされ、別のメールアドレスでリンクするオプションが表示されます。
      2. [いいえ]: OAuth リンクフローがトリガーされ、ユーザー はブラウザにリダイレクトされ、別のメールアドレスで リンクするオプションが表示されます。
    2. [いいえ]: ユーザーは認証システムに一致するアカウントを持っていますか?(check インテント が呼び出されて確認されます)
      1. [はい]: get インテントが呼び出され、get インテントが正常に返された場合はアカウントがリンクされます。
      2. [いいえ]: サービスがアカウント作成をサポートしている場合は、 createインテントが呼び出され、create インテントが正常に返された場合はアカウントがリンクされます。アカウント作成がサポートされていない場合、エンドポイントは HTTP 401 linking_error を返して、フォールバック OAuth リンクフローをトリガーする必要があります。

実装レシピ

トークン交換エンドポイントは、簡素化されたリンクをサポートするために、必要な 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:

  1. Validate the request:

    • Verify client_id, client_secret, and grant_type (must be urn:ietf:params:oauth:grant-type:jwt-bearer).
    • Validate the assertion (JWT) using the criteria in JWT Validation.
  2. Lookup user:

    • Check if the Google Account ID (sub) or email address in the JWT matches a user in your database.
  3. Respond:

    • If found: Return HTTP 200 OK with {"account_found": "true"}.
    • If not found: Return HTTP 404 Not Found with {"account_found": "false"}.

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:

  1. Validate the request:

    • Verify client_id, client_secret, and grant_type.
    • Validate the assertion (JWT).
  2. Lookup user:

    • Verify the user exists using the sub or email claim.
  3. Respond:

    • If successful: Generate and return access_token, refresh_token, and expires_in in a JSON response (HTTP 200 OK).
    • If linking fails: Return HTTP 401 Unauthorized with {"error": "linking_error"} and an optional login_hint to fall back to standard OAuth linking.

使用“使用 Google 账号登录”功能处理账号创建事宜(创建 intent)

如果您的服务支持账号创建,并且不存在任何账号,Google 会使用 intent=create 调用您的端点,以创建新用户。如需了解参数详情, 请参阅 简化的关联流程 intent。

实现方案

如需处理可选的 create intent,请执行以下操作:

  1. 验证请求:

    • 验证 client_id、client_secret 和 grant_type。
    • 验证 assertion (JWT)。
  2. 验证用户不存在:

    • 检查您的数据库中是否已存在 sub 或 email。
    • 如果用户存在,请返回 HTTP 401 Unauthorized,并使用 {"error": "linking_error", "login_hint": "USER_EMAIL"}强制 回退到 OAuth 关联流程。
  3. 创建账号:

    • 使用 JWT 中的 sub、email、name 和 picture 声明创建新的用户记录。
  4. 回应:

    • 在 JSON 响应中生成并返回令牌 (HTTP 200 OK)。

Google API クライアント ID を取得する

アカウント リンク 登録プロセスでは、Google API クライアント ID を指定する必要があります。OAuth リンクの手順を完了する際に作成したプロジェクトを使用して API クライアント ID を取得するには、次の手順を完了します。

  1. [クライアント] ページに移動します。
  2. Google API プロジェクトを作成または選択します。

    プロジェクトにウェブ アプリケーション タイプのクライアント ID がない場合は、[クライアントを作成] をクリックして作成します。[承認済みの JavaScript 生成元] ボックスにサイトのドメインを含めるようにしてください。ローカル テストまたは 開発を行う場合は、http://localhost と http://localhost:<port_number> の両方を [承認済みの JavaScript 生成元] フィールドに追加する必要があります。

実装を検証する

您可以使用 OAuth 2.0 Playground 工具验证您的实现。

在该工具中,执行以下步骤:

  1. 点击配置 以打开“OAuth 2.0 配置”窗口。
  2. 在 OAuth flow(OAuth 流程)字段中,选择 Client-side(客户端)。
  3. 在 OAuth Endpoints 字段中,选择 Custom。
  4. 在相应字段中指定您的 OAuth 2.0 端点以及您分配给 Google 的客户端 ID。
  5. 在第 1 步部分中,请勿选择任何 Google 范围。请将此字段留空,或输入适用于您服务器的范围(如果您不使用 OAuth 范围,则输入任意字符串)。完成后,点击 Authorize APIs。
  6. 在第 2 步和第 3 步部分中,完成 OAuth 2.0 流程,并验证每个步骤是否按预期运行。

您可以使用 Google 账号关联演示工具验证您的实现。

在该工具中,执行以下步骤:

  1. 点击使用 Google 账号登录按钮。
  2. 选择您要关联的账号。
  3. 输入服务 ID。
  4. (可选)输入您将请求访问的一个或多个范围。
  5. 点击开始演示。
  6. 当系统提示时,请确认您可以同意或拒绝关联请求。
  7. 确认您已重定向到相应平台。