OAuth による Google アカウントのリンク

アカウントは、業界標準の OAuth 2.0 の暗黙的フローと認証コードフローを使用してリンクされます。サービスが OAuth 2.0 準拠の承認トークン交換のエンドポイントをサポートしている必要があります。

暗黙的フローでは、Google がユーザーのブラウザで認証エンドポイントを開きます。ログインに成功すると、Google に有効期間の長いアクセス トークンが返されます。このアクセス トークンは、Google から送信されるすべてのリクエストに含まれるようになりました。

認証コードフローでは、2 つのエンドポイントが必要です。

  • 認証エンドポイント。まだログインしていないユーザーにログイン UI を表示します。認証エンドポイントは、リクエストされたアクセスへのユーザーの同意を記録するための有効期間の短い認証コードも作成します。

  • トークン交換エンドポイント。次の 2 種類の交換を行います。

    1. 長期の更新トークンと短期のアクセス トークンの認可コードを交換します。このやり取りは、ユーザーがアカウントのリンクのフローを行ったときに行われます。
    2. 有効期間が長い更新トークンと有効期間の短いアクセス トークンを交換します。この交換は、トークンが期限切れであるために Google が新しいアクセス トークンを必要とする場合に発生します。

OAuth 2.0 フローの選択

暗黙的フローは実装が簡単ですが、暗黙的フローによって発行されたアクセス トークンに有効期限は設定しないことをおすすめします。これは、暗黙のフローでトークンが期限切れになったときに、ユーザーが再びアカウントをリンクしなければならないためです。セキュリティ上の理由でトークンの有効期限が必要な場合は、代わりに認証コードフローを使用することを強くおすすめします。

設計ガイドライン

このセクションでは、OAuth リンクフローをホストするユーザー画面のデザイン要件と推奨事項について説明します。Google アプリに呼び出されると、プラットフォームから Google ログインページとアカウントのリンクの同意画面が表示されます。アカウントのリンクに同意したユーザーは、Google のアプリにリダイレクトされます。

この図は、ユーザーが Google アカウントを認証システムにリンクするための手順を示しています。最初のスクリーンショットは、ユーザーがプラットフォームから開始したリンクを示しています。2 番目の画像は、Google へのユーザーのログインを示し、3 番目の画像は、Google アカウントとアプリのリンクに関するユーザーの同意と確認を示しています。最後のスクリーンショットは、Google アプリで正常にリンクされたユーザー アカウントを示しています。
図 1.アカウントのリンク ユーザーが Google にログインし、同意画面を表示する。

要件

  1. ユーザーのアカウントが Google や Google アシスタントなどの特定の Google サービスではなく、Google にリンクされていることを伝える必要があります。

推奨事項

次の手順を行うことをおすすめします。

  1. Google のプライバシー ポリシーを表示する。同意画面に Google のプライバシー ポリシーへのリンクを含めます。

  2. 共有するデータ。明確で簡潔な表現を使って、Google が必要とするデータとその理由をユーザーに伝えます。

  3. 行動を促す明確なフレーズがある。「同意してリンクする」など、行動を促す明確なフレーズを明記する。これは、ユーザーがアカウントをリンクするために Google と共有する必要があるデータを理解する必要があるからです。

  4. 解約が可能。ユーザーがリンクしない場合に、戻るかキャンセルする方法を提供する。

  5. ログイン処理をクリアするユーザーが Google アカウントにログインするための明確な方法(ユーザー名とパスワードのフィールド、Google でログインなど)を提供していることを確認します。

  6. リンクを解除する機能。プラットフォーム上でのアカウント設定の URL など、リンクを解除するメカニズムをユーザーに提供します。あるいは、ユーザーがリンクされたアカウントを管理できる Google アカウントへのリンクを含めることもできます。

  7. ユーザー アカウントを変更できること。ユーザーがアカウントを切り替える方法を提案する。これは、ユーザーが複数のアカウントを持つ傾向がある場合に特に役立ちます。

    • ユーザーがアカウントを切り替えて同意画面を閉じる必要がある場合は、OAuth リンク暗黙的フローを使用して、ユーザーが希望するアカウントにログインできるように、回復可能なエラーを Google に送信します。
  8. ロゴを掲載する。同意画面に会社のロゴを表示します。 スタイル ガイドラインを使用してロゴを配置します。Google のロゴも表示する場合は、ロゴと商標をご覧ください。

プロジェクトを作成する

プロジェクトを作成してアカウント リンクを使用するには:

  1. Go to the Google API Console.
  2. [ プロジェクトを作成]をクリックします
  3. 名前を入力するか、生成された提案を受け入れます。
  4. 残りのフィールドを確認または編集します。
  5. 作成をクリックします

プロジェクトIDを表示するには:

  1. Go to the Google API Console.
  2. ランディングページの表でプロジェクトを見つけます。 ID列にプロジェクトIDが表示されます。

Google アカウント リンクのプロセスには同意画面が含まれます。この画面では、データへのアクセスをリクエストしているユーザーのアプリケーション、リクエストしているデータの種類、適用される規約を確認できます。Google API クライアント ID を生成する前に、OAuth 同意画面を設定する必要があります。

  1. Google API コンソールの OAuth 同意画面ページを開きます。
  2. プロンプトが表示されたら、作成したプロジェクトを選択します。
  3. [OAuth 同意画面] ページでフォームに記入し、[保存] ボタンをクリックします。

    アプリケーション名: 同意を求めるアプリケーションの名前。この名前は、アプリケーションを正確に反映し、ユーザーが他の部分で目にするアプリケーション名と一致する必要があります。アプリ名は、アカウント リンクの同意画面に表示されます。

    アプリケーションのロゴ: ユーザーがアプリを認識できるよう、同意画面に表示する画像です。ロゴは、アカウントのリンクの同意画面とアカウント設定に表示されます。

    サポートメール: ユーザーからの同意に関する問い合わせ先です。

    Google API のスコープ: スコープを使用すると、アプリケーションがユーザーの限定公開の Google データにアクセスできるようになります。Google アカウント リンクのユースケースでは、デフォルトのスコープ(メール、プロファイル、openid)で十分です。機密性の高いスコープを追加する必要はありません。通常は、事前にアクセスするのではなく、アクセスが必要になったときに段階的にスコープをリクエストすることをおすすめします。詳しくはこちらをご覧ください

    承認済みドメイン: 管理者とユーザーを保護するため、Google では、OAuth を使用して認証を行うアプリケーションのみに承認済みドメインの使用を許可します。アプリケーションのリンクは承認済みドメインでホストする必要があります。詳しくはこちらをご覧ください

    Application Homepage リンク: アプリケーションのホームページ。承認済みドメインでホストされている必要があります。

    アプリのプライバシー ポリシーへのリンク: Google アカウント リンクの同意画面に表示されます。承認済みドメインでホストされている必要があります。

    お申し込みの利用規約へのリンク(省略可): 承認済みドメインでホストされている必要があります。

    図 1. 架空のアプリケーション(Tunery)の Google アカウント リンクの同意画面

  4. [Verification Status] をオンにします。申請に確認が必要な場合は、[Submit For Verification] ボタンをクリックして、確認の申請を送信します。詳しくは、OAuth 検証の要件をご覧ください。

OAuth サーバーを実装する

To support the OAuth 2.0 implicit flow, your service makes an authorization endpoint available by HTTPS. This endpoint is responsible for authentication and obtaining consent from users for data access. The authorization endpoint presents a sign-in UI to your users that aren't already signed in and records consent to the requested access.

When a Google application needs to call one of your service's authorized APIs, Google uses this endpoint to get permission from your users to call these APIs on their behalf.

A typical OAuth 2.0 implicit flow session initiated by Google has the following flow:

  1. Google opens your authorization endpoint in the user's browser. The user signs in, if not signed in already, and grants Google permission to access their data with your API, if they haven't already granted permission.
  2. Your service creates an access token and returns it to Google. To do so, redirect the user's browser back to Google with the access token attached to the request.
  3. Google calls your service's APIs and attaches the access token with each request. Your service verifies that the access token grants Google authorization to access the API and then completes the API call.

Handle authorization requests

When a Google application needs to perform account linking via an OAuth 2.0 implicit flow, Google sends the user to your authorization endpoint with a request that includes the following parameters:

Authorization endpoint parameters
client_id The client ID you assigned to Google.
redirect_uri The URL to which you send the response to this request.
state A bookkeeping value that is passed back to Google unchanged in the redirect URI.
response_type The type of value to return in the response. For the OAuth 2.0 implicit flow, the response type is always token.
user_locale The Google Account language setting in RFC5646 format used to localize your content in the user's preferred language.

For example, if your authorization endpoint is available at https://myservice.example.com/auth, a request might look like the following:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token&user_locale=LOCALE

For your authorization endpoint to handle sign-in requests, do the following steps:

  1. Verify the client_id and redirect_uri values to prevent granting access to unintended or misconfigured client apps:

    • Confirm that the client_id matches the client ID you assigned to Google.
    • Confirm that the URL specified by the redirect_uri parameter has the following form:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  2. Check if the user is signed in to your service. If the user isn't signed in, complete your service's sign-in or sign-up flow.

  3. Generate an access token for Google to use to access your API. The access token can be any string value, but it must uniquely represent the user and the client the token is for and must not be guessable.

  4. Send an HTTP response that redirects the user's browser to the URL specified by the redirect_uri parameter. Include all of the following parameters in the URL fragment:

    • access_token: The access token you just generated
    • token_type: The string bearer
    • state: The unmodified state value from the original request

    The following is an example of the resulting URL:

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google's OAuth 2.0 redirect handler receives the access token and confirms that the state value hasn't changed. After Google has obtained an access token for your service, Google attaches the token to subsequent calls to your service APIs.

userinfo リクエストを処理する

userinfo エンドポイントは、OAuth 2.0 で保護されたリソースで、リンクされたユーザーに関するクレームを返します。userinfo エンドポイントの実装とホストは任意ですが、以下のユースケースを除きます。

トークン エンドポイントからアクセス トークンが正常に取得されると、Google は、リンクされたユーザーに関する基本的なプロフィール情報を取得するためのリクエストを userinfo エンドポイントに送信します。

userinfo エンドポイント リクエスト ヘッダー
Authorization header Bearer タイプのアクセス トークン。

たとえば、userinfo エンドポイントが https://myservice.example.com/userinfo の場合、リクエストは次のようになります。

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

userinfo エンドポイントでリクエストを処理するには、次の手順を行います。

  1. Authorization ヘッダーからアクセス トークンを抽出し、そのアクセス トークンに関連付けられたユーザーの情報を返します。
  2. アクセス トークンが無効な場合は、WWW-Authenticate レスポンス ヘッダーを使用して HTTP 401 Unauthorized エラーを返します。userinfo エラー レスポンスの例を次に示します。
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    リンク処理中に 401 Unauthorized またはその他の失敗したエラー レスポンスが返された場合、そのエラーは修復不能となり、取得したトークンは破棄されるため、ユーザーはリンク処理をやり直す必要があります。
  3. アクセス トークンが有効な場合は、HTTPS の本文に次の JSON オブジェクトを含む HTTP 200 レスポンスを返します。 レスポンス:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    userinfo エンドポイントが HTTP 200 成功レスポンスを返すと、取得したトークンとクレームがユーザーの Google アカウントに登録されます。

    userinfo エンドポイント レスポンス
    sub システム内でユーザーを識別する一意の ID。
    email ユーザーのメールアドレス。
    given_name 省略可: ユーザーの名。
    family_name 省略可: ユーザーの姓。
    name 省略可: ユーザーの氏名。
    picture 省略可: ユーザーのプロフィール写真。

実装の検証

您可以通过使用验证实现的OAuth 2.0游乐场工具。

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

  1. 单击配置打开的OAuth 2.0配置窗口。
  2. OAuth流场中,选择客户端
  3. OAuth端点字段中,选择自定义
  4. 在相应字段中指定您的 OAuth 2.0 端点和您分配给 Google 的客户端 ID。
  5. 步骤1部分,不要选择任何谷歌范围。相反,将此字段留空或键入对您的服务器有效的范围(如果不使用 OAuth 范围,则输入任意字符串)。当您完成后,单击授权的API。
  6. 步骤2步骤3段,完成OAuth 2.0流程和验证每个步骤按预期工作。

您可以通过验证您的实现谷歌帐户链接演示工具。

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

  1. 点击登录在与谷歌按钮。
  2. 选择您要关联的帐户。
  3. 输入服务标识。
  4. (可选)输入您将请求访问的一个或多个范围。
  5. 单击开始演示
  6. 出现提示时,确认您可以同意并拒绝链接请求。
  7. 确认您被重定向到您的平台。