アカウントは、業界標準の OAuth 2.0 の暗黙的フローと認証コードフローを使用してリンクされます。サービスが OAuth 2.0 準拠の承認とトークン交換のエンドポイントをサポートしている必要があります。
暗黙的フローでは、Google がユーザーのブラウザで認証エンドポイントを開きます。ログインに成功すると、Google に有効期間の長いアクセス トークンが返されます。このアクセス トークンは、Google から送信されるすべてのリクエストに含まれるようになりました。
認証コードフローでは、2 つのエンドポイントが必要です。
認証エンドポイント。まだログインしていないユーザーにログイン UI を表示します。認証エンドポイントは、リクエストされたアクセスへのユーザーの同意を記録するための有効期間の短い認証コードも作成します。
トークン交換エンドポイント。次の 2 種類の交換を行います。
- 長期の更新トークンと短期のアクセス トークンの認可コードを交換します。このやり取りは、ユーザーがアカウントのリンクのフローを行ったときに行われます。
- 有効期間が長い更新トークンと有効期間の短いアクセス トークンを交換します。この交換は、トークンが期限切れであるために Google が新しいアクセス トークンを必要とする場合に発生します。
OAuth 2.0 フローの選択
暗黙的フローは実装が簡単ですが、暗黙的フローによって発行されたアクセス トークンに有効期限は設定しないことをおすすめします。これは、暗黙のフローでトークンが期限切れになったときに、ユーザーが再びアカウントをリンクしなければならないためです。セキュリティ上の理由でトークンの有効期限が必要な場合は、代わりに認証コードフローを使用することを強くおすすめします。
設計ガイドライン
このセクションでは、OAuth リンクフローをホストするユーザー画面のデザイン要件と推奨事項について説明します。Google アプリに呼び出されると、プラットフォームから Google ログインページとアカウントのリンクの同意画面が表示されます。アカウントのリンクに同意したユーザーは、Google のアプリにリダイレクトされます。
要件
- ユーザーのアカウントが Google や Google アシスタントなどの特定の Google サービスではなく、Google にリンクされていることを伝える必要があります。
推奨事項
次の手順を行うことをおすすめします。
Google のプライバシー ポリシーを表示する。同意画面に Google のプライバシー ポリシーへのリンクを含めます。
共有するデータ。明確で簡潔な表現を使って、Google が必要とするデータとその理由をユーザーに伝えます。
行動を促す明確なフレーズがある。「同意してリンクする」など、行動を促す明確なフレーズを明記する。これは、ユーザーがアカウントをリンクするために Google と共有する必要があるデータを理解する必要があるからです。
解約が可能。ユーザーがリンクしない場合に、戻るかキャンセルする方法を提供する。
ログイン処理をクリアするユーザーが Google アカウントにログインするための明確な方法(ユーザー名とパスワードのフィールド、Google でログインなど)を提供していることを確認します。
リンクを解除する機能。プラットフォーム上でのアカウント設定の URL など、リンクを解除するメカニズムをユーザーに提供します。あるいは、ユーザーがリンクされたアカウントを管理できる Google アカウントへのリンクを含めることもできます。
ユーザー アカウントを変更できること。ユーザーがアカウントを切り替える方法を提案する。これは、ユーザーが複数のアカウントを持つ傾向がある場合に特に役立ちます。
- ユーザーがアカウントを切り替えて同意画面を閉じる必要がある場合は、OAuth リンクと暗黙的フローを使用して、ユーザーが希望するアカウントにログインできるように、回復可能なエラーを Google に送信します。
ロゴを掲載する。同意画面に会社のロゴを表示します。 スタイル ガイドラインを使用してロゴを配置します。Google のロゴも表示する場合は、ロゴと商標をご覧ください。
プロジェクトを作成する
プロジェクトを作成してアカウント リンクを使用するには:
- 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 サーバー実装は、 2 つのエンドポイント(サービスから HTTPS で利用可能)最初のエンドポイント 認可エンドポイントであり、サービス アカウントの検索、 ユーザーの同意を得る。認可エンドポイントは、 まだログインしていないユーザーにログイン UI を表示し、 アクセス権を取得します。2 つ目のエンドポイントはトークン交換エンドポイントです。 トークンと呼ばれる暗号化された文字列を取得し、ユーザーが サービスにアクセスします。
Google アプリケーションがサービスの API を呼び出す必要がある場合、Google は これらの API を呼び出す権限をユーザーから取得できます。 委任できます。
Google が開始した OAuth 2.0 認可コードフロー セッションには、 できます。
- Google がユーザーのブラウザで認可エンドポイントを開きます。フローが 音声のみのデバイスで開始された場合、Google は ダウンロードします
- ユーザーがログインし(まだログインしていない場合)、Google に次の権限を与える API を使用してデータにアクセスする必要があります(まだ権限を付与していない場合)。
- サービスによって認証コードが作成され、Google に返されます。タスク そのため、認証コードを使用してユーザーのブラウザを Google にリダイレクトします。 リクエストに添付されます
- Google がトークン交換エンドポイントに認証コードを送信します。 コードの真正性を検証し、アクセス トークンと 更新トークン。アクセス トークンは有効期間の短いトークンであり、サービス を受け入れて、API にアクセスするための認証情報です。更新トークンは有効期間が長い トークンを保存し、新しいアクセス トークンを取得するために Google が使用 期限が切れます。
- ユーザーがアカウントのリンクのフローを完了すると、それ以降は リクエストにはアクセス トークンが含まれています。
認可リクエストの処理
OAuth 2.0 認証コードを使用してアカウント リンクを行う必要がある場合 リクエストが送信されると、Google はユーザーを認可エンドポイントに送信します。 次のパラメータが含まれます。
認可エンドポイントのパラメータ | |
---|---|
client_id |
Google に割り当てたクライアント ID。 |
redirect_uri |
このリクエストに対するレスポンスを送信する宛先 URL。 |
state |
リダイレクト URL で変更されずに Google に返される会計上の値。 |
scope |
省略可: スコープ文字列をスペースで区切って指定します。 許可を求めているデータです。 |
response_type |
レスポンスで返される値のタイプ。OAuth 2.0 では、
認可コードフローでは、レスポンス タイプは常に code です。
|
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&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE
認可エンドポイントでログイン リクエストを処理するには、次の操作を行います。 手順:
client_id
が、Google に割り当てたクライアント ID と一致することと、redirect_uri
が、Google からサービスに提供されたリダイレクト URL と一致していることを確認します。これらのチェックは、権限の付与を防ぐために 意図しないクライアント アプリへのアクセスを防止できます。複数の OAuth 2.0 フローの場合、response_type
がcode
であることも確認します。- ユーザーがサービスにログインしているかどうか確認します。ユーザーがログインしていない場合は、サービスのログインまたは登録フローを完了します。
- Google が API にアクセスするために使用する認証コードを生成します。 認証コードには任意の文字列値を使用できますが、一意である必要があります。 は、ユーザー、トークンの対象となるクライアント、コードの有効期限を表します。 推測できないようにします。通常、約 10 分後に期限切れになる認可コードを発行します。
redirect_uri
パラメータで指定された URL が フォーム:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- ユーザーのブラウザを
redirect_uri
パラメータ。その際、認証コードを リダイレクトしたときに、変更されていない元の状態値がcode
パラメータとstate
パラメータを追加します。以下は、 次のようになります。https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
トークン交換リクエストの処理
サービスのトークン交換エンドポイントは、次の 2 種類のトークン交換を処理します。
- 認可コードとアクセス トークンおよび更新トークンとの交換
- 更新トークンとアクセス トークンの交換
トークン交換リクエストには、次のパラメータを使用します。
トークン交換エンドポイントのパラメータ | |
---|---|
client_id |
リクエスト元を Google として識別する文字列。この文字列は、Google の一意の識別子としてシステムに登録されている必要があります。 |
client_secret |
Google に登録したサービスのシークレット文字列。 |
grant_type |
交換されるトークンの種類。次のいずれか
authorization_code または refresh_token 。 |
code |
grant_type=authorization_code の場合、このパラメータは
ログインまたはトークン交換から Google が受け取ったコード
提供します |
redirect_uri |
grant_type=authorization_code の場合、このパラメータは
最初の承認リクエストで使用される URL。 |
refresh_token |
grant_type=refresh_token の場合、このパラメータは
Google がトークン交換エンドポイントから受け取った更新トークン。 |
認可コードとアクセス トークンおよび更新トークンとの交換
ユーザーがログインすると、認可エンドポイントから一時的な 認証コードを Google に送信すると、Google がトークン交換にリクエストを送信し、 認証コードをアクセス トークンと交換して更新し、 あります。
これらのリクエストでは、grant_type
の値は authorization_code
、
code
の値は、以前に付与した認証コードの値です。
Google に送信されます。以下は、
認証コードの例を以下に示します。
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
アクセス トークンと更新トークンの認証コードを交換するには、
トークン交換エンドポイントは、次の処理を実行して POST
リクエストに応答します。
手順:
client_id
でリクエストの送信元が承認済みであることを確認するclient_secret
が期待値と一致することを確認します。- 認証コードが有効で有効期限が切れていないこと、認証コードが リクエストで指定されたクライアント ID が、リクエストに関連付けられたクライアント ID と 認証コード。
redirect_uri
パラメータで指定された URL が同一であることを確認する 初期承認リクエストで使用されている値に設定します。- 上記の条件をすべて満たせない場合は HTTP を
本文が
{"error": "invalid_grant"}
の 400 Bad Request エラー。 - それ以外の場合は、認証コードのユーザー ID を使用して更新を生成する アクセス トークンが含まれます。トークンには任意の文字列値を指定できますが、 トークンを使用するユーザーとクライアントを一意に表し、 推測できないようにしてください。アクセス トークンについては、トークンの有効期限も トークン。これは通常、トークンを発行してから 1 時間です。 更新トークンに有効期限はありません。
- HTTPS レスポンスの本文で次の JSON オブジェクトを返します。
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google がユーザーのアクセス トークンと更新トークンを保存し、 アクセス トークンの有効期限。アクセス トークンの有効期限が切れると、Google は 更新トークンを送信して、トークン交換エンドポイントから新しいアクセス トークンを取得します。
更新トークンとアクセス トークンの交換
アクセス トークンの有効期限が切れると、Google はトークン交換にリクエストを送信します 更新トークンを新しいアクセス トークンと交換します。
これらのリクエストでは、grant_type
の値は refresh_token
、値は
refresh_token
は、以前に付与した更新トークンの値です。
Google更新トークンを交換するリクエストの例を次に示します。
アクセス トークンの場合:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
更新トークンをアクセス トークンと交換するには、トークン交換エンドポイント
次の手順に従って、POST
リクエストに応答します。
client_id
がリクエスト元を Google として識別していることを確認します。client_secret
が期待値と一致することを確認します。- 更新トークンが有効で、リクエストで指定されたクライアント ID が更新に関連付けられたクライアント ID と一致していることを確認します。
- 上記の条件をすべて満たせない場合は、HTTP 400 を返します。
{"error": "invalid_grant"}
を本文とする不正なリクエスト エラー。 - それ以外の場合は、更新トークンのユーザー ID を使用してアクセス トークンを生成します。これらのトークンは任意の文字列値にできますが、一意である必要があります。 は、トークンの対象となるユーザーとクライアントを表します。これらは、 あります。アクセス トークンの場合は、トークンの有効期限、 トークンを発行してから通常 1 時間後です。
- HTTPS レスポンスの本文で次の JSON オブジェクトを返します。
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
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つ以上のスコープを入力します。
- スタートデモをクリックしてください。
- プロンプトが表示されたら、リンク要求に同意して拒否できることを確認します。
- プラットフォームにリダイレクトされていることを確認します。