ClientLogin から OAuth 2.0 に移行する

Ikai Lan、YouTube Developer Relations – June 2013

YouTube API は、OAuth 2.0 を使用してユーザー リクエストを承認します。YouTube API で今後 ClientLogin 認証または同様の認証のサポートを追加する予定があるかどうかという質問がよく寄せられます。ただし、2012 年 4 月 20 日をもって ClientLogin は正式に非推奨となっており、そのようなメカニズムを追加する予定はありません。

OAuth 2.0 認証のさまざまなフローをサポートする方が ClientLogin よりも YouTube ユーザーにとってメリットが大きいと Google が考える理由は数多くあります。これらのフローは、デスクトップ アプリケーション、ウェブ専用アプリケーション、モバイル アプリケーション、さらには高度な入力メカニズムを備えていないテレビなどのデバイスで実行されるアプリケーションのユースケースをサポートします。これは ClientLogin を使用して行うのが難しいことです。また、ClientLogin は、リリース後に多くのデベロッパーに問題を引き起こすことがわかっています。

サーバーサイド、スタンドアロン スクリプトでの 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 API クライアント ライブラリにも、トークンの管理に役立つメソッドが用意されています。これらのメソッドはクライアント間で共有でき、下位レベルの HTTP ライブラリで直接使用することもできます(クライアント ヘッダーまたは URL パラメータとして)。

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

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

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

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

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

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

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

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

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

YouTube API に対するオフライン/長期間有効なアクセス

OAuth 2.0 では短期間有効なトークンと長期間有効なトークンを使用します。1 回限りの操作には短期間有効なアクセス トークンが適しています。このトークンは付与されてから短期間で期限切れとなります。長時間実行ジョブの場合は、短期のアクセス トークンの取得に使用される更新トークンの取得を検討してください。

アプリケーションが有効期間の短いアクセス トークンではなく、有効期間の長い更新トークンを受け取るようにするには、クライアント ID の作成時に「インストール済みアプリケーション」フローを使用し、「インストール済みアプリケーション タイプ」の値に Other を選択します。

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

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

Android アプリケーションを作成する際、デベロッパーは Google Play services を利用して認証の詳細を処理できます。Google Play 開発者サービスでは、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 タグを使用してお気軽にお問い合わせください。