ClientLogin から OAuth 2.0 への移行

, YouTube Developer Relations – June 2013

YouTube Data API バージョン 3 以降では、YouTube Data API および Analytics API でサポートされるすべての認証方法に OAuth 2.0 が使用されます。今後 YouTube の API で ClientLogin 認証または同等の認証方法をサポートするかどうか、よくお問い合わせをいただきます。ただし、YouTube では 2012 年 4 月 20 日で ClientLogin のサポートを公式に終了し、このメカニズムを追加する予定はありません。

YouTube では、さまざまな理由で ClientLogin よりも OAuth 2.0 のさまざまな認証フローをサポートするほうが YouTube ユーザーの利益になると考えています。これらのフローはデスクトップ アプリケーション、ウェブ専用アプリケーション、ネイティブ モバイル アプリケーションの他、簡単な入力メカニズムがないために ClientLogin の使用が困難なテレビなどの端末のアプリケーションでのユース ケースもサポートします。また、多くのデベロッパーにとって、ClientLogin のほうが立ち上げ後の問題を引き起こしやすいことも判明しました。これらの問題の一部については、ブログ記事 ClientLogin #FAIL でも取り上げました。

サーバーサイド、スタンドアロン スクリプトでの OAuth 2.0 の使用

多くのデベロッパーは ClientLogin を使用し、ブラウザを介在させずにサーバー上で実行されるコマンドライン スクリプトを認証しています。OAuth 2.0 では、Google Play Services を使用し GoogleAuthUtil. を通じてトークンを取得する Android アプリケーションの場合を除いて、ほとんど常にブラウザが介在します。

ウェブ専用フローにおいて、ユーザーの代理として認証済みの API 呼び出しを作成するウェブサイトは、アプリケーションが何にアクセスを試みているのかを説明する google.com 認証ページにユーザーをリダイレクトする必要があります。次に、ウェブ アプリケーションは API 呼び出しを作成するために使用するトークンを受け取ります。ユーザーは connected apps and sites ページを使用していつでもアプリケーションのアクセス権を取り消すことができます。

Python コード サンプルでは、コマンドライン スクリプトでブラウザを起動する方法、コンソールから API 呼び出しを作成する方法、ローカル サーバーを作成して認証リダイレクトの後でコードをリッスンする方法、以後の API 呼び出しのためにトークンを自動的に保存する方法を示します。以下は、その実践についての動画です:

使用されているトークンは ASCII 文字列です。これが offline トークンである場合は移行可能です。このコードが同じクライアント ID とクライアント シークレットを持つ OAuth 2.0 クライアントをインスタンス化するのであれば、取得されたトークンを使用してデスクトップでスクリプトを実行し、GUI を使用せずにコードをリモート サーバー上にコピーして使用することができます。Python 以外のプログラミング言語用の Google APIs Client Library でもトークン管理のためのヘルパー メソッドを提供しています。これはクライアント間での共有が可能で、低レベル HTTP ライブラリでも直接クライアント ヘッダで使用したり URL パラメータとして使用することができます

以下は offline トークンを使用したサーバーサイド スクリプトの例です:

  • ディレクトリの新しい動画を監視して YouTube に自動でアップロードするデーモン
  • 新しい動画を使用して再生リストのコンテンツを毎日更新する cron ジョブ
  • YouTube Analytics API を通じて動画データを監視し、合計再生時間が制限値を超えた場合などの特定のイベントが発生したときにチャンネル管理者に通知するスクリプト。この場合、Analytics API では ClientLogin がサポートされていないので、サポートされる認証方法は OAuth 2.0 のみである点に注意してください。

サーバー サイド プロセスに使用できる offline トークンの生成方法については、期限の長いアクセス トークンのセクションで詳しく説明します。

クライアント ID とクライアント シークレットのベスト プラクティス

同じクライアント ID とクライアント シークレットのペアを使用するすべてのコードは、同じアクセス トークンを使用できます。クライアント ID とクライアント シークレットへのアクセスを、組織内のマシンおよび端末上で実行されるコードに限定するのが理想的です。

クライアント ID とクライアント シークレットをネイティブ モバイル アプリケーションのコードに含めないでください。携帯端末からの OAuth 2.0 認証を行っているすべてのデベロッパーはインストール済みアプリケーションのクライアント ID を使用する必要があります。これによって自分のチームがリリースしたアプリケーションからしかリクエストが送られていないことを検証するための追加情報を要求します。

Android 端末の場合は、クライント ID とクライアント シークレットを使用する代わりにパッケージ名と署名証明書のハッシュを組み合わせて使用し、アプリケーションを識別します。iOS 端末の場合は Bundle ID と App Store ID が使用されます。この情報の取得に関する公式のドキュメントについては、Google API console ヘルプ ページをご覧ください。

YouTube API でサービス アカウントが機能しない

YouTube API の呼び出しでサービス アカウントが機能しないのは、サービス アカウントには関連付けられた YouTube チャンネルが必要ですが、新規または既存のチャンネルとサービス アカウントを関連付けることができないためです。サービス アカウントを使用した YouTube API 呼び出しを作成すると、エラー タイプ unauthorized、理由 youtubeSignupRequiredエラーが返されます

YouTube API に対するオフライン/長期限のアクセス

OAuth 2.0 では期限の短いトークンと期限の長いトークンを使用します。1 回限りの操作には短期限のアクセス トークンが適しています。このトークンは付与されてから短時間で期限切れとなります。長期のジョブでは、短期限のアクセス トークンを取得するために使用されるリフレッシュ トークンを取得することを検討してください。

アプリケーションが短期限のアクセス トークンを受け取るのではなく、必ず長期限のリフレッシュ トークンを受け取れるようにするには、クライアント ID を作成するときに [Installed Application] フローを使用し、[Installed application type] の値は Other を選択します。

このユース ケースでは [Installed application] フローの使用をおすすめします。ウェブ アプリケーションで YouTube API に長時間のアクセスが必要な場合は、初期の認証リクエストまたはクライアント設定access_type パラメータを offlineapproval_prompt パラメータを force に設定して取得することができます。一部のクライアント ライブラリはアクセス トークンの取得とリフレッシュを管理できます。独自のカスタム認証コードを作成したい場合は、Google Code ブログに投稿した記事を参考にしてください。

携帯電話やタブレットなどの端末での OAuth 2.0 の使用

Android アプリケーションを開発する場合は、Google Play services を利用して認証を細かく処理することができます。Google Play Services は YouTube プラットフォーム用の API を含むすべての Google API 用の標準認証フローを提供します。ClientLogin によるカスタム認証を使用するよりも、この方法を使用したほうが Android アプリケーションのユーザー エクスペリエンスは大幅に向上します。

iOS 端末の場合は、次の 2 つのオプションがあります。

「セカンド ディスプレイ」としての使用を意図した端末や簡単な入力メカニズムを持たないテレビなどの端末には OAuth 2.0 for Devices が適しています。OAuth 2.0 for Devices は、認証リクエストが要求されたときにユーザーにユニーク コードを提供します。この時点でユーザーはラップトップや携帯電話などの別の端末で http://google.com/device にアクセスしてユニーク コードを入力することを求められます。アプリケーションでは、次のような画面が表示されます。

ユーザーが別の端末からコードを入力している間、アプリケーションは定期的にポーリングしてコードの入力を確認します。コードが入力されると、アプリケーションは API 呼び出しを作成するためのトークンを取得します。この動作はデモでご覧いただけます。これは、ウェブを使用可能なすべての端末で実行できます。API 自体はプラットフォーム非依存なので、ウェブ表示機能を持たない端末にも有効です。デモのため Python によるサンプル コードを公開していますので、参考にしてください。

まとめ

OAuth 2.0 認証は YouTube での認証が必要なデベロッパーに柔軟性を提供します。ClientLogin に慣れているデベロッパーの場合、OAuth 2.0 を使用するためにアプリケーションをセットアップするにはやや労力が必要になる場合がありますが、一度移行してしまえば OAuth 2.0 アプリケーションはエンド ユーザー向けのさまざまなプラットフォームに対してより高度な柔軟性、セキュリティ、ユーザビリティを提供します。

OAuth 2.0 またはこの記事の例に関してご質問がある場合は、StackOverflow の youtube-api タグを使用するか YouTube Developers Live Office Hours でご遠慮なくお問い合わせください。