モバイル / デスクトップ アプリ用の OAuth 2.0

このドキュメントでは、スマートフォン、タブレット、パソコンなどのデバイスにインストールされたアプリケーションで 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 フローの実装には、次のライブラリとサンプルを使用することをおすすめします。

前提条件

プロジェクトでAPI を有効にする

Google API を呼び出すアプリケーションでは、 API Consoleでこれらの API を有効にする必要があります。

プロジェクトで API を有効にするには:

  1. Google API Console内のOpen the API Library
  2. If prompted, select a project, or create a new one.
  3. [ライブラリ] ページで YouTube Data API を見つけて有効にします。アプリケーションで使用する他の API を見つけて、それらも有効にしてください。

承認認証情報を作成する

OAuth 2.0 を使用して Google API にアクセスするアプリケーションには、Google の OAuth 2.0 サーバーに対してアプリケーションを識別するための認証情報が必要です。プロジェクトの認証情報を作成する手順は次のとおりです。これにより、アプリケーションは認証情報を使用して、そのプロジェクトで有効にした API にアクセスできるようになります。

  1. Go to the Credentials page.
  2. [認証情報を作成] > [OAuth クライアント ID] をクリックします。
  3. 以下のセクションでは、Google の承認サーバーがサポートするクライアント タイプとリダイレクト方法について説明します。アプリケーションに推奨されるクライアント タイプを選択し、OAuth クライアントに名前を付け、必要に応じてフォーム内の他のフィールドを設定します。
Android
  1. アプリケーションの種類として [Android] を選択します。
  2. OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
  3. Android アプリのパッケージ名を入力します。この値は、アプリ マニフェスト ファイル内の <manifest> 要素の package 属性で定義されています。
  4. アプリ配信の SHA-1 署名証明書フィンガープリントを入力します。
    • アプリで Google Play アプリ署名を使用している場合は、Google Play Console のアプリ署名ページから SHA-1 フィンガープリントをコピーします。
    • 独自のキーストアと署名鍵を管理している場合は、Java に含まれる keytool ユーティリティを使用して、人が読める形式で証明書情報を出力します。keytool の出力の Certificate fingerprints セクションにある SHA1 の値をコピーします。詳細については、Android 用 Google API ドキュメントのクライアントの認証をご覧ください。
  5. (省略可)Android アプリの所有権を確認します。
  6. [作成] をクリックします。
iOS
  1. アプリケーションの種類として [iOS] を選択します。
  2. OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
  3. アプリのバンドル ID を入力します。バンドル ID は、アプリの情報プロパティ リスト リソース ファイル(info.plist)にある CFBundleIdentifier キーの値です。この値は、Xcode プロジェクト エディタの [General] ペインまたは [Signing & Capabilities] ペインに最もよく表示されます。バンドル ID は、Apple の App Store Connect サイトにあるアプリの [App Information] ページの [General Information] セクションにも表示されます。
  4. (省略可)

    アプリが Apple の App Store で公開されている場合は、アプリの App Store ID を入力します。ストア ID は、すべての Apple App Store の URL に含まれる数値文字列です。

    1. iOS または iPadOS デバイスで Apple App Store アプリを開きます。
    2. 自分のアプリを探します。
    3. [共有] ボタン(四角形と上矢印)を選択します。
    4. [リンクをコピー] を選択します。
    5. コピーしたリンクをテキスト エディタに貼り付けます。URL の最後の部分が App Store ID です。

      例: https://apps.apple.com/app/google/id284815942

  5. (省略可)

    チーム ID を入力します。詳細については、Apple Developer Account のドキュメントのチーム ID を探すをご覧ください。

  6. [作成] をクリックします。
UWP
  1. アプリケーションの種類として [Universal Windows Platform] を選択します。
  2. OAuth クライアントの名前を入力します。この名前は、クライアントを識別するためにプロジェクトの Credentials page に表示されます。
  3. アプリの 12 文字の Microsoft Store ID を入力してください。この値は、Microsoft パートナー センターの [アプリ ID] ページの [アプリ管理] セクションにあります。
  4. [作成] をクリックします。

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 を使用するように完全に移行するには、以下のアクションを完了する必要があります。

  1. Google ログイン SDK を使用するようにコードを更新します。
  2. Google API Console でカスタム スキームのサポートを無効にします。

Google Sign-In Android SDK に移行する手順は次のとおりです。

  1. Google ログイン Android SDK を使用するようにコードを更新します。
    1. コードを調べて、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 パラメータの定義をご覧ください。
    2. Google ログイン SDK の設定に必要な scope リクエスト パラメータと client_id リクエスト パラメータをメモしておきます。
    3. Android アプリへの Google ログインの統合を開始するの手順に沿って SDK をセットアップします。前のステップで取得した client_id を再利用するため、バックエンド サーバーの OAuth 2.0 クライアント ID を取得するステップはスキップできます。
    4. サーバーサイド API アクセスの有効化の手順に沿って操作します。これには次の手順が含まれます。
      1. getServerAuthCode メソッドを使用して、権限をリクエストするスコープの認証コードを取得します。
      2. 認証コードをアプリのバックエンドに送信して、アクセス トークンおよび更新トークンと交換します。
      3. 取得したアクセス トークンを使用して、ユーザーの代わりに Google API を呼び出します。
  2. Google API Console でカスタム スキームのサポートを無効にします。
    1. OAuth 2.0 認証情報のリストに移動し、Android クライアントを選択します。
    2. [Advanced Settings] セクションに移動し、[Enable Custom URI Scheme] チェックボックスをオフにして、[Save] をクリックしてカスタム URI スキームのサポートを無効にします。
カスタム URI スキームの有効化
推奨される代替方法が使用できない場合は、次の手順に沿って Android クライアントでカスタム URI スキームを有効にできます。
  1. OAuth 2.0 認証情報のリストに移動し、Android クライアントを選択します。
  2. [Advanced Settings] セクションに移動し、[Enable Custom URI Scheme] チェックボックスをオンにして、[Save] をクリックしてカスタム URI スキームのサポートを有効にします。
Chrome アプリでカスタム 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/youtubeYouTube アカウントの管理
https://www.googleapis.com/auth/youtube.channel-memberships.creator現在アクティブなチャンネル メンバー、メンバーの現在のレベル、いつメンバーになったかをリストで確認する
https://www.googleapis.com/auth/youtube.force-sslYouTube 動画、評価、コメント、字幕の表示、編集、完全削除
https://www.googleapis.com/auth/youtube.readonlyYouTube アカウントの表示
https://www.googleapis.com/auth/youtube.uploadYouTube 動画の管理
https://www.googleapis.com/auth/youtubepartnerYouTube のアセットや関連するコンテンツの表示と管理
https://www.googleapis.com/auth/youtubepartner-channel-auditYouTube パートナーの監査プロセス時に関連する 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 ハッシュです。
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
プレーン コード チャレンジは、上で生成したコード検証ツールと同じ値です。
code_challenge = code_verifier

ステップ 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 と一致しない場合、redirect_uri_mismatch エラーが発生します。

次の表に、各メソッドに適切な redirect_uri パラメータ値を示します。

redirect_uri 個の値
カスタム URI スキーム com.example.app:redirect_uri_path

または

com.googleusercontent.apps.123:redirect_uri_path
  • com.example.app は、管理下にあるドメインのリバース DNS 表記です。カスタム スキームには有効なピリオドを含める必要があります。
  • com.googleusercontent.apps.123 は、クライアント ID のリバース DNS 表記です。
  • redirect_uri_path はオプションのパス コンポーネントです(/oauth2redirect など)。パスは単一のスラッシュで始まる必要があります。これは通常の HTTP URL とは異なります。
ループバック IP アドレス http://127.0.0.1:port または http://[::1]:port

関連するループバック IP アドレスをプラットフォームにクエリし、ランダムな使用可能なポートで HTTP リスナーを起動します。port は、アプリがリッスンする実際のポート番号に置き換えます。

モバイルアプリでのループバック IP アドレス リダイレクト オプションのサポートは 非推奨になりました。

response_type 必須

Google OAuth 2.0 エンドポイントが認証コードを返すかどうかを決定します。

インストール済みアプリのパラメータ値を code に設定します。

scope 必須

ユーザーの代わりにアプリケーションがアクセスできるリソースを識別するスコープをスペースで区切ったリスト。これらの値は、Google がユーザーに表示する同意画面を通知します。

スコープを使用すると、アプリケーションは必要なリソースへのアクセスのみをリクエストできると同時に、ユーザーはアプリケーションに付与するアクセス権の量を制御できます。したがって、リクエストされるスコープの数とユーザーから同意を得る可能性は逆相関になります。

YouTube Data API v3 では、次のスコープを使用します。

スコープ
https://www.googleapis.com/auth/youtubeYouTube アカウントの管理
https://www.googleapis.com/auth/youtube.channel-memberships.creator現在アクティブなチャンネル メンバー、メンバーの現在のレベル、いつメンバーになったかをリストで確認する
https://www.googleapis.com/auth/youtube.force-sslYouTube 動画、評価、コメント、字幕の表示、編集、完全削除
https://www.googleapis.com/auth/youtube.readonlyYouTube アカウントの表示
https://www.googleapis.com/auth/youtube.uploadYouTube 動画の管理
https://www.googleapis.com/auth/youtubepartnerYouTube のアセットや関連するコンテンツの表示と管理
https://www.googleapis.com/auth/youtubepartner-channel-auditYouTube パートナーの監査プロセス時に関連する YouTube チャンネルの個人情報の表示

Google API へのアクセスに使用できるスコープの一覧については、OAuth 2.0 API スコープのドキュメントをご覧ください。

code_challenge 推奨

エンコードされた code_verifier を指定します。これは、認証コードの交換時にサーバーサイドのチャレンジとして使用されます。詳しくは、上記のコード作成に関する課題セクションをご覧ください。

code_challenge_method 推奨

認証コードの交換時に使用される code_verifier のエンコードに使用されたメソッドを指定します。このパラメータは、上記の code_challenge パラメータとともに使用する必要があります。code_challenge を含むリクエストに code_challenge_method の値が存在しない場合、デフォルトの plain が使用されます。このパラメータでサポートされている値は、S256 または plain のみです。

state 推奨

認可リクエストと認可サーバーのレスポンスの間で状態を維持するために、アプリケーションが使用する文字列値を指定します。ユーザーがアプリケーションのアクセス リクエストに同意または拒否した後、サーバーは redirect_uri の URL フラグメント識別子(#)で name=value ペアとして送信した値を返します。

このパラメータは、ユーザーをアプリケーション内の正しいリソースに誘導する、ノンスを送信する、クロスサイト リクエスト フォージェリを軽減するなど、いくつかの目的で使用できます。redirect_uri は推測できるため、state 値を使用すると、受信接続が認証リクエストの結果であるという確実性を高めることができます。ランダムな文字列を生成するか、クライアントの状態を取得する Cookie のハッシュをエンコードする場合や、クライアントの状態を取得する別の値のハッシュをエンコードする場合、レスポンスを検証して、リクエストとレスポンスが同じブラウザから送信されていることをさらに確認することで、クロスサイト リクエスト フォージェリなどの攻撃から保護できます。state トークンを作成して確認する方法の例については、OpenID Connect のドキュメントをご覧ください。

login_hint 省略可

認証しようとしているユーザーをアプリケーションで認識している場合は、このパラメータを使用して Google 認証サーバーにヒントを提供できます。サーバーはこのヒントを使用して、ログイン フォームのメール フィールドに事前入力するか、適切なマルチログイン セッションを選択することで、ログインフローを簡素化します。

パラメータ値をメールアドレスまたは sub 識別子に設定します。これは、ユーザーの Google ID に相当します。

サンプル認証 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.readonly&
 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.readonly&
 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 注: このプロパティは、リクエストに openidprofileemail などの 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 Data API を呼び出すなど)。

YouTube Data API は、複数の YouTube チャンネル(レコード レーベルや映画スタジオなど)を所有、管理する YouTube コンテンツ所有者向けのサービス アカウントのみをサポートしています。

OAuth 2.0 Playground ですべての Google API を試し、スコープを確認できます。

HTTP GET の例

Authorization: Bearer HTTP ヘッダーを使用した youtube.channels エンドポイント(YouTube Data API)の呼び出しは次のようになります。独自のアクセス トークンを指定する必要があります。

GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

access_token クエリ文字列パラメータを使用した、認証されたユーザーに対して同じ API の呼び出しの例を次に示します。

GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

curl の例

これらのコマンドは、curl コマンドライン アプリケーションを使用してテストできます。HTTP ヘッダー オプションを使用した例を次に示します(推奨)。

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true

または、クエリ文字列パラメータ オプションを使用します。

curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&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 では、ここで説明する多くのベスト プラクティスが確立されています。