このドキュメントでは、スマートフォン、タブレット、パソコンなどのデバイスにインストールされたアプリケーションで Google の OAuth 2.0 エンドポイントを使用して、YouTube Data API へのアクセスを認証する方法について説明します。
OAuth 2.0 を使用すると、ユーザー名やパスワードなどの情報を非公開にしたまま、特定のデータをアプリケーションと共有することができます。たとえば、アプリケーションは OAuth 2.0 を使用してチャンネルの YouTube データを取得する権限を取得できます。
インストール済みのアプリは個々のデバイスに配布され、それらのアプリはシークレットを保持できないことが前提となります。ユーザーがアプリを開いているときや、アプリがバックグラウンドで実行されているときに、Google API にアクセスできます。
この承認フローは、ウェブサーバー アプリケーションで使用されるフローと似ています。主な違いは、インストール済みのアプリはシステム ブラウザを開き、ローカル リダイレクト URI を指定して、Google の承認サーバーからのレスポンスを処理する必要があることです。
代替手段
モバイルアプリの場合は、Android または iOS の Google ログインを使用することをおすすめします。Google ログインのクライアント ライブラリは認証とユーザーの認可を処理するため、ここで説明する下位レベルのプロトコルよりも実装が簡単な場合があります。
システム ブラウザをサポートしていないデバイスで実行されているアプリや、入力機能が制限されているアプリ(テレビ、ゲーム機、カメラ、プリンタなど)の場合は、テレビとデバイス用の OAuth 2.0 またはテレビと入力が制限されたデバイスでのログインをご覧ください。
ライブラリとサンプル
このドキュメントで説明する OAuth 2.0 フローの実装には、次のライブラリとサンプルを使用することをおすすめします。
- Android 用 AppAuth ライブラリ
- iOS 用 AppAuth ライブラリ
- アプリ用の OAuth: Windows のサンプル
前提条件
プロジェクトでAPI を有効にする
Google API を呼び出すアプリケーションでは、 API Consoleでこれらの API を有効にする必要があります。
プロジェクトで API を有効にするには:
- Google API Console内のOpen the API Library 。
- If prompted, select a project, or create a new one.
- [ライブラリ] ページで YouTube Data API を見つけて有効にします。アプリケーションで使用する他の API を見つけて、それらも有効にします。
承認認証情報を作成する
OAuth 2.0 を使用して Google API にアクセスするアプリケーションには、Google の OAuth 2.0 サーバーに対してアプリケーションを識別するための認証情報が必要です。プロジェクトの認証情報を作成する手順は次のとおりです。これにより、アプリケーションは認証情報を使用して、そのプロジェクトで有効にした API にアクセスできるようになります。
- Go to the Credentials page.
- [認証情報を作成] > [OAuth クライアント ID] をクリックします。
- 以下のセクションでは、Google の承認サーバーがサポートするクライアント タイプとリダイレクト方法について説明します。アプリケーションに推奨されるクライアント タイプを選択し、OAuth クライアントに名前を付け、必要に応じてフォーム内の他のフィールドを設定します。
Android
- アプリケーションの種類として [Android] を選択します。
- OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
- Android アプリのパッケージ名を入力します。この値は、アプリ マニフェスト ファイル内の
<manifest>
要素のpackage
属性で定義されています。 - アプリ配信の SHA-1 署名証明書フィンガープリントを入力します。
- アプリで Google Play アプリ署名を使用している場合は、Google Play Console のアプリ署名ページから SHA-1 フィンガープリントをコピーします。
- 独自のキーストアと署名鍵を管理している場合は、Java に含まれる keytool ユーティリティを使用して、人が読める形式で証明書情報を出力します。keytool の出力の
Certificate fingerprints
セクションにあるSHA1
の値をコピーします。詳細については、Android 用 Google API ドキュメントのクライアントの認証をご覧ください。
- (省略可)Android アプリの所有権を確認します。
- [作成] をクリックします。
iOS
- アプリケーションの種類として [iOS] を選択します。
- OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
- アプリのバンドル ID を入力します。バンドル ID は、アプリの情報プロパティ リスト リソース ファイル(info.plist)にある CFBundleIdentifier キーの値です。この値は、Xcode プロジェクト エディタの [General] ペインまたは [Signing & Capabilities] ペインに最もよく表示されます。バンドル ID は、Apple の App Store Connect サイトにあるアプリの [App Information] ページの [General Information] セクションにも表示されます。
- (省略可)
アプリが Apple の App Store で公開されている場合は、アプリの App Store ID を入力します。ストア ID は、すべての Apple App Store の URL に含まれる数値文字列です。
- iOS または iPadOS デバイスで Apple App Store アプリを開きます。
- 自分のアプリを探します。
- [共有] ボタン(四角形と上矢印)を選択します。
- [リンクをコピー] を選択します。
- コピーしたリンクをテキスト エディタに貼り付けます。URL の最後の部分が App Store ID です。
例:
https://apps.apple.com/app/google/id284815942
- (省略可)
チーム ID を入力します。詳細については、Apple Developer Account のドキュメントのチーム ID を探すをご覧ください。
- [作成] をクリックします。
UWP
- アプリケーションの種類として [Universal Windows Platform] を選択します。
- OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
- アプリの 12 文字の Microsoft Store ID を入力してください。この値は、Microsoft パートナー センターの [アプリ ID] ページの [アプリ管理] セクションにあります。
- [作成] をクリックします。
UWP アプリの場合、カスタム URI スキームは 39 文字以下にする必要があります。
カスタム URI スキーム(Android、iOS、UWP)
カスタム URI スキームはディープリンクの一種で、カスタム定義のスキームを使用してアプリを開きます。
Android でのカスタム URI スキームの使用に代わる方法Android 向け Google ログイン SDK を使用すると、OAuth 2.0 レスポンスがアプリに直接配信されるため、リダイレクト URI が不要になります。
Android 用 Google ログイン SDK に移行する方法
現在 Android での OAuth 統合にカスタム スキームを使用している場合、推奨される Android 向け Google ログイン SDK を使用するように完全に移行するには、以下のアクションを完了する必要があります。
- Google ログイン SDK を使用するようにコードを更新します。
- Google API Console でカスタム スキームのサポートを無効にします。
Google Sign-In Android SDK に移行する手順は次のとおりです。
-
Google ログイン Android SDK を使用するようにコードを更新します。
-
コードを調べて、Google の OAuth 2.0 サーバーにリクエストを送信している場所を特定します。カスタム スキームを使用している場合、リクエストは次のようになります。
https://accounts.google.com/o/oauth2/v2/auth? scope=<SCOPES>& response_type=code& &state=<STATE>& redirect_uri=com.example.app:/oauth2redirect& client_id=<CLIENT_ID>
com.example.app:/oauth2redirect
は、上記の例のカスタム スキームのリダイレクト URI です。カスタム URI スキーム値の形式の詳細については、redirect_uri
パラメータの定義をご覧ください。 -
Google ログイン SDK の設定に必要な
scope
リクエスト パラメータとclient_id
リクエスト パラメータをメモしておきます。 -
Android アプリへの Google ログインの統合を開始するの手順に沿って SDK をセットアップします。前のステップで取得した
client_id
を再利用するため、バックエンド サーバーの OAuth 2.0 クライアント ID を取得するステップはスキップできます。 -
サーバーサイド API アクセスの有効化の手順に沿って操作します。これには次の手順が含まれます。
-
getServerAuthCode
メソッドを使用して、権限をリクエストするスコープの認証コードを取得します。 - 認証コードをアプリのバックエンドに送信して、アクセス トークンおよび更新トークンと交換します。
- 取得したアクセス トークンを使用して、ユーザーの代わりに Google API を呼び出します。
-
-
コードを調べて、Google の OAuth 2.0 サーバーにリクエストを送信している場所を特定します。カスタム スキームを使用している場合、リクエストは次のようになります。
-
Google API Console でカスタム スキームのサポートを無効にします。
- OAuth 2.0 認証情報のリストに移動し、Android クライアントを選択します。
- [Advanced Settings] セクションに移動し、[Enable Custom URI Scheme] チェックボックスをオフにして、[Save] をクリックしてカスタム URI スキームのサポートを無効にします。
カスタム URI スキームの有効化
推奨される代替方法が使用できない場合は、次の手順に沿って Android クライアントでカスタム URI スキームを有効にできます。- OAuth 2.0 認証情報のリストに移動し、Android クライアントを選択します。
- [Advanced Settings] セクションに移動し、[Enable Custom URI Scheme] チェックボックスをオンにして、[Save] をクリックしてカスタム URI スキームのサポートを有効にします。
Chrome Identity API を使用すると、OAuth 2.0 レスポンスをアプリに直接配信できるため、リダイレクト URI が不要になります。
アプリの所有権を確認する(Android、Chrome)
アプリの所有権を確認することで、アプリのなりすましのリスクを軽減できます。
Android
Google Play デベロッパー アカウントをお持ちで、アプリが Google Play Console に登録されていれば、確認プロセスを完了できます。検証を成功させるには、次の要件を満たす必要があります。
- 検証対象の Android OAuth クライアントと同じパッケージ名と SHA-1 署名証明書フィンガープリントを持つアプリが Google Play Console に登録されている必要があります。
- Google Play Console でアプリに対する管理者権限が必要です。Google Play Console でのアクセス管理の詳細をご覧ください。
確認プロセスを完了するには、Android クライアントの [Verify App Ownership] セクションで、[Verify Ownership] ボタンをクリックします。
検証に成功すると、検証プロセスが成功したことを示す通知が表示されます。それ以外の場合は、エラー プロンプトが表示されます。
本人確認の失敗を解決するには、次の方法をお試しください。
- 検証対象のアプリが Google Play Console で登録済みアプリであることを確認します。
- Google Play Console でアプリに対する管理者権限があることを確認します。
Chrome
確認プロセスを完了するには、Chrome ウェブストア デベロッパー アカウントを使用します。 適格性確認を成功させるには、次の要件を満たす必要があります。
- 検証を完了する Chrome 拡張機能 OAuth クライアントと同じアイテム ID で、Chrome ウェブストア デベロッパー ダッシュボードに登録済みアイテムが必要です。
- Chrome ウェブストア アイテムのパブリッシャーである必要があります。 Chrome ウェブストア デベロッパー ダッシュボードでのアクセス管理については、こちらをご覧ください。
確認プロセスを完了するには、Chrome 拡張機能クライアントの [アプリの所有権の確認] セクションで [所有権を確認] ボタンをクリックします。
注: アカウントにアクセス権を付与した後、数分待ってから確認プロセスを完了してください。
検証に成功すると、検証プロセスが成功したことを示す通知が表示されます。それ以外の場合は、エラー プロンプトが表示されます。
本人確認の失敗を解決するには、次の方法をお試しください。
- Chrome ウェブストア デベロッパー ダッシュボードに、確認対象の Chrome 拡張機能 OAuth クライアントと同じアイテム ID の登録済みアイテムがあることを確認します。
- アプリのパブリッシャーであること(アプリの個々のパブリッシャーまたはアプリのグループ パブリッシャーのメンバーであること)を確認します。Chrome ウェブストア デベロッパー ダッシュボードでのアクセス管理について、詳細をご確認ください。
- グループ投稿者リストを更新した直後の場合は、グループ投稿者リストが Chrome ウェブストア デベロッパー ダッシュボードで同期されていることを確認します。 ニュース メディアのメンバーシップ リストを同期する方法について詳しくは、こちらをご覧ください。
ループバック IP アドレス(macOS、Linux、Windows デスクトップ)
この URL を使用して認証コードを受け取るには、アプリケーションがローカル ウェブサーバーでリッスンする必要があります。これは多くのプラットフォームで利用できるわけではありませんが、すべてのプラットフォームで利用できるわけではありません。ただし、プラットフォームでサポートされている場合は、この方法を使用して認証コードを取得することをおすすめします。
アプリは、承認レスポンスを受け取ったら、ユーザビリティを最大限に高めるため、ブラウザを閉じてアプリに戻るようユーザーに指示する HTML ページを表示して応答する必要があります。
推奨される使用方法 | macOS、Linux、Windows のデスクトップ アプリ(ユニバーサル Windows プラットフォームを除く) |
フォームの値 | アプリケーション タイプを [デスクトップ アプリ] に設定します。 |
手動でのコピーと貼り付け
アクセス スコープを特定する
スコープを使用すると、アプリケーションは必要なリソースへのアクセスのみをリクエストできると同時に、ユーザーはアプリケーションに付与するアクセス権の量を制御できるようになります。そのため、リクエストされるスコープの数とユーザーの同意を得る可能性の間には逆の関係になる場合があります。
OAuth 2.0 認証の実装を開始する前に、アプリがアクセス権限を必要とするスコープを特定することをおすすめします。
注YouTube Data API v3 では、次のスコープを使用します。
スコープ | |
---|---|
https://www.googleapis.com/auth/youtube | YouTube アカウントの管理 |
https://www.googleapis.com/auth/youtube.channel-memberships.creator | 現在アクティブなチャンネル メンバー、メンバーの現在のレベル、いつメンバーになったかをリストで確認する |
https://www.googleapis.com/auth/youtube.force-ssl | YouTube 動画、評価、コメント、字幕の表示、編集、完全削除 |
https://www.googleapis.com/auth/youtube.readonly | YouTube アカウントの表示 |
https://www.googleapis.com/auth/youtube.upload | YouTube 動画の管理 |
https://www.googleapis.com/auth/youtubepartner | YouTube のアセットや関連するコンテンツの表示と管理 |
https://www.googleapis.com/auth/youtubepartner-channel-audit | YouTube パートナーの監査プロセス時に関連する YouTube チャンネルの個人情報の表示 |
Google API へのアクセスに使用できるスコープの一覧については、OAuth 2.0 API スコープのドキュメントをご覧ください。
OAuth 2.0 アクセス トークンの取得
次の手順は、アプリケーションが Google の OAuth 2.0 サーバーと連携し、ユーザーの代わりに API リクエストを実行することについてユーザーの同意を取得する方法を示しています。ユーザーの承認が必要な Google API リクエストをアプリケーションで実行するには、アプリケーションでその同意を得る必要があります。
ステップ 1: コードベリファイアとチャレンジを生成する
Google は、インストール済みアプリのフローの安全性を高めるために、Proof Key for Code Exchange(PKCE)プロトコルをサポートしています。認可リクエストごとに一意のコード検証ツールが作成され、その変換された値「code_challenge」が認可サーバーに送信され、認証コードが取得されます。
コード検証ツールを作成する
code_verifier
は、予約されていない文字 [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" を使用した高エントロピーの暗号ランダムな文字列で、最小の長さは 43 文字、最大の長さは 128 文字です。
コード検証ツールには、値を推測することが実用的にならないように十分なエントロピーが必要です。
コード チャレンジを作成する
コードチャレンジを作成する方法は 2 つあります。
コード チャレンジの生成方法 | |
---|---|
S256(推奨) | コード チャレンジは、コード検証ツールの Base64URL(パディングなし)でエンコードされた SHA256 ハッシュです。
|
プレーン | コード チャレンジは、上で生成したコード検証ツールと同じ値です。
|
ステップ 2: Google の OAuth 2.0 サーバーにリクエストを送信する
ユーザーの承認を取得するには、Google の承認サーバー(https://accounts.google.com/o/oauth2/v2/auth
)にリクエストを送信します。このエンドポイントは、アクティブ セッションのルックアップを処理し、ユーザーを認証して、ユーザーの同意を取得します。エンドポイントには SSL 経由でのみアクセス可能で、HTTP(非 SSL)接続は拒否されます。
認可サーバーは、インストール済みのアプリケーションに対して次のクエリ文字列パラメータをサポートしています。
パラメータ | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
必須
アプリケーションのクライアント ID。この値は API Console Credentials pageにあります。 |
||||||||||||||||
redirect_uri |
必須
Google の承認サーバーがアプリにレスポンスを送信する方法を指定します。インストール済みのアプリで使用できるリダイレクト オプションはいくつかあります。特定のリダイレクト方法を念頭に、承認認証情報を設定します。 この値は、クライアントの API Console
Credentials pageで構成した OAuth 2.0 クライアントの承認済みリダイレクト URI のいずれかと完全に一致する必要があります。この値が承認済みの URI と一致しない場合、 次の表に、各メソッドに適切な
|
||||||||||||||||
response_type |
必須
Google OAuth 2.0 エンドポイントが認証コードを返すかどうかを決定します。 インストール済みアプリのパラメータ値を |
||||||||||||||||
scope |
必須
ユーザーの代わりにアプリケーションがアクセスできるリソースを識別するスコープをスペースで区切ったリスト。これらの値は、Google がユーザーに表示する同意画面を通知します。 スコープを使用すると、アプリケーションは必要なリソースへのアクセスのみをリクエストできると同時に、ユーザーはアプリケーションに付与するアクセス権の量を制御できます。したがって、リクエストされるスコープの数とユーザーから同意を得る可能性は逆相関になります。 YouTube Data API v3 では、次のスコープを使用します。
Google API へのアクセスに使用できるスコープの一覧については、OAuth 2.0 API スコープのドキュメントをご覧ください。 |
||||||||||||||||
code_challenge |
推奨
エンコードされた |
||||||||||||||||
code_challenge_method |
推奨
認証コードの交換時に使用される |
||||||||||||||||
state |
推奨
認可リクエストと認可サーバーのレスポンスの間で状態を維持するために、アプリケーションが使用する文字列値を指定します。ユーザーがアプリケーションのアクセス リクエストに同意または拒否した後、サーバーは このパラメータは、ユーザーをアプリケーション内の正しいリソースに誘導する、ノンスを送信する、クロスサイト リクエスト フォージェリを軽減するなど、いくつかの目的で使用できます。 |
||||||||||||||||
login_hint |
省略可
認証しようとしているユーザーをアプリケーションで認識している場合は、このパラメータを使用して Google 認証サーバーにヒントを提供できます。サーバーはこのヒントを使用して、ログイン フォームのメール フィールドに事前入力するか、適切なマルチログイン セッションを選択することで、ログインフローを簡素化します。 パラメータ値をメールアドレスまたは |
サンプル認証 URL
以下のタブは、さまざまなリダイレクト URI オプションの認証 URL の例を示しています。
各 URL は、ユーザーの YouTube データを取得するアクセスを許可するスコープへのアクセスをリクエストします。redirect_uri
パラメータの値を除き、URL は同じです。この URL には、必須の response_type
パラメータと client_id
パラメータと、省略可能な state
パラメータも含まれます。読みやすくするために、各 URL には改行とスペースが含まれています。
カスタム URI スキーム
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=com.example.app%3A/oauth2redirect& client_id=client_id
ループバック IP アドレス
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=http%3A//127.0.0.1%3A9004& client_id=client_id
ステップ 3: Google がユーザーに同意を求める
このステップでは、要求されたアクセス権をアプリケーションに付与するかどうかをユーザーが決定します。この段階で、Google は同意ウィンドウを表示します。このウィンドウには、ユーザーの認証情報を使用してアクセス権限をリクエストしているアプリケーションと Google API サービスの名前と、付与するアクセス スコープの概要が表示されます。これにより、ユーザーは、アプリケーションからリクエストされた 1 つ以上のスコープへのアクセス権を付与することに同意するか、リクエストを拒否することができます。
この段階では、アプリケーションはアクセス権が付与されたかどうかを示す Google の OAuth 2.0 サーバーからのレスポンスを待つため、何もする必要はありません。このレスポンスについては、次の手順で説明します。
エラー
Google の OAuth 2.0 認可エンドポイントへのリクエストで、想定される認証と認可のフローではなく、ユーザー向けのエラー メッセージが表示されることがあります。一般的なエラーコードと推奨される解決策を以下に示します。
admin_policy_enforced
Google Workspace 管理者のポリシーにより、Google アカウントでリクエストされた 1 つ以上のスコープを承認できません。OAuth クライアント ID へのアクセス権が明示的に付与されるまで、管理者がすべてのスコープ、または機密性の高いスコープと制限付きスコープへのアクセスを制限する方法の詳細については、Google Workspace 管理者用ヘルプ記事の Google Workspace のデータにアクセスできるサードパーティ製アプリと内部アプリを制御するをご覧ください。
disallowed_useragent
認可エンドポイントは、Google の OAuth 2.0 ポリシーで許可されていない埋め込みユーザー エージェント内に表示されます。
Android
Android デベロッパーが android.webkit.WebView
で承認リクエストを開くと、このエラー メッセージが表示されることがあります。
代わりに、Android 用 Google ログインや OpenID Foundation の Android 用 AppAuth などの Android ライブラリを使用する必要があります。
Android アプリが埋め込みユーザー エージェントで一般的なウェブリンクを開き、ユーザーがニュース メディアのサイトから Google の OAuth 2.0 認可エンドポイントに移動した場合に、このエラーが発生することがあります。デベロッパーは、一般的なリンクをオペレーティング システムのデフォルト リンクハンドラ(Android アプリリンク ハンドラまたはデフォルトのブラウザアプリを含む)で開けるようにする必要があります。また、Android カスタムタブ ライブラリもサポートされているオプションです。
iOS
iOS および macOS のデベロッパーの場合、WKWebView
で承認リクエストを開くと、このエラーが発生することがあります。
代わりに、iOS 用 Google ログインや OpenID Foundation の iOS 用 AppAuth などの iOS ライブラリを使用する必要があります。
iOS アプリまたは macOS アプリが埋め込みユーザー エージェントで一般的なウェブリンクを開き、ユーザーがニュース メディアのサイトから Google の OAuth 2.0 認可エンドポイントに移動すると、ウェブ デベロッパーがこのエラーが発生することがあります。デベロッパーは、一般的なリンクをオペレーティング システムのデフォルト リンクハンドラ(ユニバーサル リンク ハンドラまたはデフォルトのブラウザアプリを含む)で開けるようにする必要があります。また、SFSafariViewController
ライブラリもサポートされているオプションです。
org_internal
リクエスト内の OAuth クライアント ID は、特定の Google Cloud 組織の Google アカウントへのアクセスを制限するプロジェクトの一部です。この構成オプションについて詳しくは、ヘルプ記事「OAuth 同意画面の設定」のユーザータイプのセクションをご覧ください。
invalid_grant
コード検証ツールとチャレンジを使用している場合、code_callenge
パラメータが無効であるか、指定されていません。code_challenge
パラメータが正しく設定されていることを確認します。
アクセス トークンの更新時に、トークンが期限切れになっているか、無効になっている可能性があります。ユーザーを再度認証し、新しいトークンを取得するためのユーザーの同意を求めます。このエラーが引き続き表示される場合は、アプリケーションが正しく構成されていることと、リクエストで正しいトークンとパラメータを使用していることを確認してください。それ以外の場合は、ユーザー アカウントが削除または無効化されている可能性があります。
redirect_uri_mismatch
認可リクエストで渡された redirect_uri
が、OAuth クライアント ID の承認済みのリダイレクト URI と一致しない。 Google API Console Credentials pageで承認済みのリダイレクト URI を確認します。
渡された redirect_uri
が、クライアント タイプに対して無効である可能性があります。
redirect_uri
パラメータは、非推奨でサポートされなくなった OAuth 帯域外(OOB)フローを指す場合があります。統合を更新するには、移行ガイドをご覧ください。
invalid_request
リクエストになんらかの問題がありました。これには、いくつかの理由が考えられます。
- リクエストの形式が正しくありません
- リクエストに必須パラメータが含まれていませんでした
- リクエストで、Google でサポートされていない認証方法が使用されています。OAuth 統合で推奨の統合方法が使用されていることを確認する
- リダイレクト URI にはカスタム スキームを使用する: 「Custom URI scheme is not supported on Chrome apps」または「Custom URI scheme is not enabled for your Android client」というエラー メッセージが表示される場合は、Chrome アプリでサポートされていないカスタム URI スキームを使用していることを意味します。Android では、デフォルトで無効になっています。詳しくは、代替カスタム URI スキームをご覧ください。
ステップ 4: OAuth 2.0 サーバー レスポンスを処理する
アプリケーションが認可レスポンスを受信する方法は、使用するリダイレクト URI スキームによって異なります。スキームに関係なく、レスポンスには認証コード(code
)またはエラー(error
)が含まれます。たとえば、error=access_denied
はユーザーがリクエストを拒否したことを示します。
ユーザーがアプリケーションへのアクセスを許可したら、次のステップで説明するように、認証コードをアクセス トークンおよび更新トークンと交換できます。
ステップ 5: 更新トークンとアクセス トークンに認証コードを交換する
認証コードをアクセス トークンと交換するには、https://oauth2.googleapis.com/token
エンドポイントを呼び出して、次のパラメータを設定します。
フィールド | |
---|---|
client_id |
Credentials pageから取得したクライアント ID。 API Console |
client_secret |
Credentials pageから取得したクライアント シークレット。 API Console |
code |
最初のリクエストから返された認証コード。 |
code_verifier |
ステップ 1 で作成したコード検証ツール。 |
grant_type |
OAuth 2.0 仕様で定義されているように、このフィールドの値は authorization_code に設定する必要があります。 |
redirect_uri |
指定された client_id の API Console
Credentials page にプロジェクト用にリストされているリダイレクト URI の 1 つ。 |
次のスニペットはサンプル リクエストを示しています。
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=http://127.0.0.1:9004& grant_type=authorization_code
Google はこのリクエストに対して、有効期間の短いアクセス トークンと更新トークンを含む JSON オブジェクトを返します。
レスポンスには、次のフィールドが含まれます。
フィールド | |
---|---|
access_token |
Google API リクエストを承認するためにアプリケーションが送信するトークン。 |
expires_in |
アクセス トークンの残りの存続期間(秒)。 |
id_token |
注: このプロパティは、リクエストに openid 、profile 、email などの ID スコープが含まれていた場合にのみ返されます。値は、ユーザーに関するデジタル署名された ID 情報を含む JSON Web Token(JWT)です。 |
refresh_token |
新しいアクセス トークンの取得に使用できるトークン。更新トークンは、ユーザーがアクセス権を取り消すまで有効です。 インストールされているアプリケーションに対しては、更新トークンが常に返されることに注意してください。 |
scope |
access_token によって付与されるアクセス スコープ。スペースで区切られ、大文字と小文字が区別される文字列のリストとして表現されます。 |
token_type |
返されるトークンのタイプ。現時点では、このフィールドの値は常に Bearer に設定されています。 |
次のスニペットは、レスポンスの例を示しています。
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Google API の呼び出し
アプリケーションがアクセス トークンを取得した後、API に必要なアクセス スコープが付与されている場合、トークンを使用して、特定のユーザー アカウントに代わって Google API を呼び出すことができます。これを行うには、access_token
クエリ パラメータまたは Authorization
HTTP ヘッダーの Bearer
値のいずれかを使用して、API へのリクエストにアクセス トークンを含めます。クエリ文字列はサーバーログに表示されることが多いため、可能であれば HTTP ヘッダーを使用することをおすすめします。ほとんどの場合、クライアント ライブラリを使用して Google API の呼び出しを設定できます(YouTube Live Streaming API を呼び出すなど)。
YouTube Live Streaming API は、サービス アカウントのフローをサポートしていません。サービス アカウントを YouTube アカウントにリンクする方法はないため、このフローでリクエストを承認しようとすると、NoLinkedYouTubeAccount
エラーが発生します。
OAuth 2.0 Playground ですべての Google API を試し、スコープを確認できます。
HTTP GET の例
Authorization: Bearer
HTTP ヘッダーを使用した
liveBroadcasts.list
エンドポイント(YouTube Live Streaming API)への呼び出しは次のようになります。独自のアクセス トークンを指定する必要があります。
GET /youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
access_token
クエリ文字列パラメータを使用した、認証されたユーザーに対して同じ API の呼び出しの例を次に示します。
GET https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true
curl
の例
これらのコマンドは、curl
コマンドライン アプリケーションを使用してテストできます。HTTP ヘッダー オプションを使用した例を次に示します(推奨)。
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true
または、クエリ文字列パラメータ オプションを使用します。
curl https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true
アクセス トークンをリフレッシュする
アクセス トークンは定期的に期限切れになり、関連する API リクエストに対する無効な認証情報になります。トークンに関連付けられているスコープへのオフライン アクセスをリクエストした場合、ユーザーに権限を求めることなくアクセス トークンを更新できます(ユーザーがいない場合も同様です)。
アクセス トークンを更新するため、次のパラメータを含む HTTPS POST
リクエストを Google の承認サーバー(https://oauth2.googleapis.com/token
)に送信します。
フィールド | |
---|---|
client_id |
API Consoleから取得したクライアント ID。 |
client_secret |
API Consoleから取得したクライアント シークレット。
(client_secret は、Android、iOS、Chrome アプリケーションとして登録されたクライアントからのリクエストには適用されません)。 |
grant_type |
OAuth 2.0 仕様で定義されているように、このフィールドの値は refresh_token に設定する必要があります。 |
refresh_token |
認証コードの交換から返された更新トークン。 |
次のスニペットはサンプル リクエストを示しています。
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
ユーザーがアプリケーションに付与したアクセス権を取り消さない限り、トークン サーバーは新しいアクセス トークンを含む JSON オブジェクトを返します。次のスニペットはサンプル レスポンスです。
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
発行される更新トークンの数には上限があります。クライアントとユーザーの組み合わせごとに 1 つ、すべてのクライアントでユーザーごとに 1 つの上限があります。更新トークンは長期保存に保管し、有効な間は使用し続ける必要があります。アプリケーションがあまりにも多くの更新トークンをリクエストすると、これらの上限に達する可能性があります。その場合、古い更新トークンは機能しなくなります。
トークンの取り消し
アプリケーションに付与したアクセス権の取り消しをユーザーが希望する場合があります。ユーザーは [ アカウント設定] にアクセスしてアクセス権を取り消すことができます。詳しくは、サポート ドキュメントの「アカウントにアクセスできるサードパーティのサイトやアプリ」の「サイトまたはアプリのアクセス権を削除する」をご覧ください。
また、アプリケーションに付与されているアクセス権をプログラムで取り消すこともできます。プログラムによる取り消しは、ユーザーが登録解除した場合や、アプリケーションを削除した場合、またはアプリが必要とする API リソースが大幅に変更された場合に重要です。つまり、削除プロセスの一部に API リクエストを含めて、アプリに以前付与された権限を確実に削除することができます。
プログラムでトークンを取り消すには、アプリケーションで https://oauth2.googleapis.com/revoke
にリクエストを行い、トークンをパラメータとして含めます。
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
トークンは、アクセス トークンまたはリフレッシュ トークンです。トークンがアクセス トークンであり、対応する更新トークンがある場合、更新トークンも取り消されます。
取り消しが正常に処理された場合、レスポンスの HTTP ステータス コードは 200
です。エラー状態の場合は、HTTP ステータス コード 400
がエラーコードとともに返されます。
関連情報
IETF の最新のベスト プラクティスである OAuth 2.0 for Native Apps では、ここで説明する多くのベスト プラクティスが確立されています。