OpenSSL から 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 ユーザーにとって効果的であると考える理由はたくさんあります。これらのフローは、デスクトップ アプリケーション、ウェブ専用アプリケーション、ネイティブ モバイル アプリケーション、さらには高度な入力メカニズムを備えていないテレビなどのデバイスで実行されるアプリケーションのユースケースもサポートしています。これは 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 API クライアント ライブラリでは、トークンを管理するためのヘルパー メソッドが用意されています。これは、クライアント間で共有し、クライアント ヘッダーや URL パラメータとして直接下位レベルの HTTP ライブラリで使用することもできます。

以下は 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 Data API 呼び出しを使用できません。サービス アカウントには関連付けられている YouTube チャンネルが必要であり、新規または既存のチャンネルをサービス アカウントに関連付けることはできません。サービス アカウントを使用して 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 つのオプションがあります。

  • Google+ Platform for iOS。Google サービスのログインを統合し、ソーシャル機能も有効にします。
  • gtm-oauth2 toolkit。認証 UIWebView を提供し、トークンを管理します。

「セカンド ディスプレイ」としての使用を意図した端末や簡単な入力メカニズムを持たないテレビなどの端末には 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 タグを使用してお気軽にお問い合わせください。