アカウントは、業界標準の OAuth 2.0 の暗黙的フローと認証コードフローを使用してリンクされます。サービスが OAuth 2.0 準拠の承認とトークン交換のエンドポイントをサポートしている必要があります。
In the implicit flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from Google.
In the authorization code flow, you need two endpoints:
The authorization endpoint, which presents the sign-in UI to your users that aren't already signed in. The authorization endpoint also creates a short-lived authorization code to record users' consent to the requested access.
The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Choose an OAuth 2.0 flow
Although the implicit flow is simpler to implement, Google recommends that access tokens issued by the implicit flow never expire. This is because the user is forced to link their account again after a token expires with the implicit flow. If you need token expiration for security reasons, we strongly recommend that you use the authorization code flow instead.
Design guidelines
This section describes the design requirements and recommendations for the user screen that you host for OAuth linking flows. After it's called by Google's app, your platform displays a sign in to Google page and account linking consent screen to the user. The user is directed back to Google's app after giving their consent to link accounts.
Requirements
- You must communicate that the user’s account will be linked to Google, not a specific Google product like Google Home or Google Assistant.
Recommendations
We recommend that you do the following:
Display Google's Privacy Policy. Include a link to Google’s Privacy Policy on the consent screen.
Data to be shared. Use clear and concise language to tell the user what data of theirs Google requires and why.
Clear call-to-action. State a clear call-to-action on your consent screen, such as “Agree and link.” This is because users need to understand what data they're required to share with Google to link their accounts.
Ability to cancel. Provide a way for users to go back or cancel, if they choose not to link.
Clear sign-in process. Ensure that users have clear method for signing in to their Google account, such as fields for their username and password or Sign in with Google.
Ability to unlink. Offer a mechanism for users to unlink, such as a URL to their account settings on your platform. Alternatively, you can include a link to Google Account where users can manage their linked account.
Ability to change user account. Suggest a method for users to switch their account(s). This is especially beneficial if users tend to have multiple accounts.
- If a user must close the consent screen to switch accounts, send a recoverable error to Google so the user can sign in to the desired account with OAuth linking and the implicit flow.
Include your logo. Display your company logo on the consent screen. Use your style guidelines to place your logo. If you wish to also display Google's logo, see Logos and trademarks.
プロジェクトを作成する
プロジェクトを作成してアカウント リンクを使用するには:
- Go to the Google API Console.
- [ プロジェクトを作成]をクリックします 。
- 名前を入力するか、生成された提案を受け入れます。
- 残りのフィールドを確認または編集します。
- 作成をクリックします 。
プロジェクトIDを表示するには:
- Go to the Google API Console.
- ランディングページの表でプロジェクトを見つけます。 ID列にプロジェクトIDが表示されます。
OAuth 同意画面を設定する
Google アカウント リンクのプロセスには同意画面が含まれます。この画面では、データへのアクセスをリクエストしているユーザーのアプリケーション、リクエストしているデータの種類、適用される規約を確認できます。Google API クライアント ID を生成する前に、OAuth 同意画面を設定する必要があります。
- Google API コンソールの OAuth 同意画面ページを開きます。
- プロンプトが表示されたら、作成したプロジェクトを選択します。
[OAuth 同意画面] ページでフォームに記入し、[保存] ボタンをクリックします。
アプリケーション名: 同意を求めるアプリケーションの名前。この名前は、アプリケーションを正確に反映し、ユーザーが他の部分で目にするアプリケーション名と一致する必要があります。アプリ名は、アカウント リンクの同意画面に表示されます。
アプリケーションのロゴ: ユーザーがアプリを認識できるよう、同意画面に表示する画像です。ロゴは、アカウントのリンクの同意画面とアカウント設定に表示されます。
サポートメール: ユーザーからの同意に関する問い合わせ先です。
Google API のスコープ: スコープを使用すると、アプリケーションがユーザーの限定公開の Google データにアクセスできるようになります。Google アカウント リンクのユースケースでは、デフォルトのスコープ(メール、プロファイル、openid)で十分です。機密性の高いスコープを追加する必要はありません。通常は、事前にアクセスするのではなく、アクセスが必要になったときに段階的にスコープをリクエストすることをおすすめします。詳しくはこちらをご覧ください。
承認済みドメイン: 管理者とユーザーを保護するため、Google では、OAuth を使用して認証を行うアプリケーションのみに承認済みドメインの使用を許可します。アプリケーションのリンクは承認済みドメインでホストする必要があります。詳しくはこちらをご覧ください。
Application Homepage リンク: アプリケーションのホームページ。承認済みドメインでホストされている必要があります。
アプリのプライバシー ポリシーへのリンク: Google アカウント リンクの同意画面に表示されます。承認済みドメインでホストされている必要があります。
お申し込みの利用規約へのリンク(省略可): 承認済みドメインでホストされている必要があります。
図 1. 架空のアプリケーション(Tunery)の Google アカウント リンクの同意画面
[Verification Status] をオンにします。申請に確認が必要な場合は、[Submit For Verification] ボタンをクリックして、確認の申請を送信します。詳しくは、OAuth 検証の要件をご覧ください。
OAuth サーバーを実装する
为了支持 OAuth 2.0 隐式流,您的服务会进行授权 端点。此端点负责进行身份验证, 就数据访问征得用户同意。授权端点 向尚未登录的用户显示登录界面,并记录 同意所请求的访问。
当 Google 应用需要调用您的某项服务获得授权的 API 时, Google 使用此端点从您的用户处获取调用这些 API 的权限 。
由 Google 发起的典型 OAuth 2.0 隐式流会话具有以下特征: 以下流程:
- Google 会在用户的浏览器中打开您的授权端点。通过 如果用户尚未登录,则直接登录,然后授予 Google 以下权限: 访问您的 API 访问其数据(如果尚未授权)。
- 您的服务会创建一个访问令牌并将其返回给 Google。为此,请将用户的浏览器重定向回 Google,并提供相应的访问权限 令牌。
- Google 调用您的服务的 API,并附加带有 。您的服务会验证访问令牌是否向 Google 授予 访问 API 的授权,然后完成 API 调用。
处理授权请求
当 Google 应用需要通过 OAuth 2.0 执行账号关联时 隐式流程,Google 会通过 请求,其中包含以下参数:
授权端点参数 | |
---|---|
client_id |
您分配给 Google 的客户 ID。 |
redirect_uri |
此请求的响应发送到的网址。 |
state |
将一个在 重定向 URI。 |
response_type |
要在响应中返回的值的类型。对于 OAuth 2.0 隐式
则响应类型始终为 token 。 |
user_locale |
“Google 账号语言设置” RFC5646 用于将您的内容本地化为用户首选语言的格式。 |
例如,如果您的授权端点位于
https://myservice.example.com/auth
时,请求可能如下所示:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token&user_locale=LOCALE
为了让授权端点能够处理登录请求,请执行以下操作 步骤:
验证
client_id
和redirect_uri
值, 防止向意外或配置错误的客户端应用授予访问权限:- 确认
client_id
是否与您的客户端 ID 匹配 分配给 Google。 - 确认
redirect_uri
指定的网址 参数的格式如下:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- 确认
检查用户是否已登录您的服务。如果用户未登录 中,完成服务的登录或注册流程。
生成访问令牌,以供 Google 用于访问您的 API。通过 访问令牌可以是任何字符串值,但必须唯一地表示 令牌对应的用户和客户端,且不得被猜到。
发送 HTTP 响应,将用户浏览器重定向到相应网址 由
redirect_uri
参数指定。添加所有 以下参数:access_token
:您刚刚生成的访问令牌token_type
:字符串bearer
state
:原始状态的未修改状态值 请求
以下是生成的网址示例:
https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING
Google 的 OAuth 2.0 重定向处理程序收到访问令牌并确认
state
值没有更改。在 Google 获得
访问令牌,则 Google 会将该令牌附加到后续调用
服务 API
userinfo リクエストを処理する
userinfo エンドポイントは、OAuth 2.0 で保護されたリソースで、リンクされたユーザーに関するクレームを返します。userinfo エンドポイントの実装とホストは任意ですが、以下のユースケースを除きます。
- Google One タップによるリンクされたアカウントへのログイン。
- Android TV のスムーズな定期購入。
トークン エンドポイントからアクセス トークンが正常に取得されると、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 エンドポイントでリクエストを処理するには、次の手順を行います。
- Authorization ヘッダーからアクセス トークンを抽出し、そのアクセス トークンに関連付けられたユーザーの情報を返します。
- アクセス トークンが無効な場合は、
WWW-Authenticate
レスポンス ヘッダーを使用して HTTP 401 Unauthorized エラーを返します。userinfo エラー レスポンスの例を次に示します。HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
リンク処理中に 401 Unauthorized またはその他の失敗したエラー レスポンスが返された場合、そのエラーは修復不能となり、取得したトークンは破棄されるため、ユーザーはリンク処理をやり直す必要があります。 アクセス トークンが有効な場合は、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の遊び場のツールを。
ツールで、次の手順を実行します。
- 設定をクリックし OAuth 2.0の設定]ウィンドウを開きます。
- OAuthの流れ場では、クライアント側を選択します。
- OAuthのエンドポイント]フィールドで、[カスタム]を選択します。
- OAuth2.0エンドポイントとGoogleに割り当てたクライアントIDを対応するフィールドに指定します。
- ステップ1セクションでは、すべてのGoogleサービスのスコープを選択しないでください。代わりに、このフィールドを空白のままにするか、サーバーに有効なスコープ(または、OAuthスコープを使用しない場合は任意の文字列)を入力してください。設定が完了したら、承認のAPIをクリックします。
- ステップ2とステップ3のセクションでは、OAuth 2.0のフローを通過し、意図したように各ステップが動作することを確認。
あなたは使用して実装を検証することができ、Googleアカウントのリンクデモツールを。
ツールで、次の手順を実行します。
- Googleのボタンでサインインしをクリックしてください。
- リンクするアカウントを選択してください。
- サービスIDを入力します。
- オプションで、アクセスを要求する1つ以上のスコープを入力します。
- スタートデモをクリックしてください。
- プロンプトが表示されたら、リンク要求に同意して拒否できることを確認します。
- プラットフォームにリダイレクトされていることを確認します。