Google Data API での OAuth の使用

Eric Bidelman、Google Data APIs チーム
2008 年 9 月

はじめに

デベロッパーにとってエキサイティングな時代です。ウェブ全体で多くのオープン標準が採用され始めています。ご存じのとおり、Google は常に標準を重視し、オープンソース コミュニティの育成に力を注いでいます。

最近、すべての Google Data API で OAuth のサポートが採用されました。OAuth は、ユーザーのプライベート データにアクセスするデスクトップ アプリケーションとウェブ アプリケーションの方法を標準化することを目的としたオープン プロトコルです。OAuth は、標準的かつ安全な方法で API 認証を行う手段を提供します。プログラマーは、可能な限りコードを再利用するように教えられます。OAuth を使用すると、デベロッパーが記述する重複コードの量を減らし、さまざまなプロバイダの複数のサービスで動作するツールを簡単に作成できます。

オーディエンス

この記事は、Google Data API の 1 つ以上を理解していることを前提としていますが、OAuth の背後にあるコンセプトを理解していることは前提としていません。OAuth を初めて使用する方や、OAuth に興味がある方は、ぜひご覧ください。この記事では、コンセプトの基本的な基礎知識について説明します。また、Google の OAuth 実装の詳細についても説明します。

このドキュメントは、AuthSub の使用に精通しているデベロッパー(特にセキュリティ強化モードで登録しているデベロッパー)も対象としています。説明を進める中で、2 つのプロトコルの類似点相違点を強調していきます。AuthSub を使用するアプリケーションがある場合は、この情報を使用して、よりオープンで最新のプロトコルである OAuth に移行できます。


用語について

OAuth を理解するには、用語を理解することが重要です。OAuth 仕様と Google の ウェブ アプリケーションの OAuth 認証に関するドキュメントは、特定の定義に大きく依存しています。ここでは、Google の OAuth 実装のコンテキストにおける各定義の意味を明確にしましょう。

  1. 「OAuth ダンス」

    OAuth 認証/認可プロセスの全体を説明するために私が作った非公式な用語です。

  2. (OAuth)リクエスト トークン

    Google に、アプリケーションが Google Data API のいずれかへのアクセスをリクエストしていることを知らせる初期トークン。OAuth ダンスの 2 番目のステップでは、ユーザーが手動でデータへのアクセスを許可します。このステップが成功すると、リクエスト トークンが承認されます。

  3. (OAuth)アクセス トークン

    ダンスの最後のステップは、承認されたリクエスト トークンをアクセス トークンと交換することです。アプリケーションがこのトークンを取得すると、トークンが取り消されない限り、ユーザーは OAuth ダンスを再度行う必要はありません。

    AuthSub との類似性:
    OAuth アクセス トークンは、安全な AuthSub セッション トークンと同じものです。

  4. (OAuth)エンドポイント

    これらは、アプリケーションを認証してアクセス トークンを取得するために必要な URI です。OAuth プロセスの各ステップに 1 つずつ、合計 3 つあります。Google の OAuth エンドポイントは次のとおりです。

    リクエスト トークンを取得します。https://www.google.com/accounts/OAuthGetRequestToken
    リクエスト トークンを承認します。https://www.google.com/accounts/OAuthAuthorizeToken
    アクセス トークンにアップグレードします。https://www.google.com/accounts/OAuthGetAccessToken

    AuthSub との類似性:
    承認済みリクエスト トークンをアクセス トークンと交換することは、https://www.google.com/accounts/AuthSubRequestTokenhttps://www.google.com/accounts/AuthSubSessionToken でそれぞれ 1 回限りの AuthSub トークンを長期セッション トークンにアップグレードすることに似ています。AuthSub には初期リクエスト トークンの概念がない点が異なります。代わりに、ユーザーは AuthSubRequestToken 認証ページからトークン プロセスを開始します。

  5. (OAuth)サービス プロバイダ

    Google Data APIs の場合、このプロバイダは Google です。一般に、サービス プロバイダは、OAuth エンドポイントを提供するウェブサイトまたはウェブサービスを説明するために使用されます。OAuth サービス プロバイダの別の例として、MySpace があります。

  6. (OAuth)コンシューマー

    ユーザーのデータへのアクセス権限をリクエストするプログラム(つまり、アプリケーション)。OAuth プロトコルは、さまざまな種類のクライアント(ウェブ、インストール済み、パソコン、モバイル)に対応できる柔軟性を備えています。

: OAuth プロトコルはデスクトップ アプリケーション/インストール型アプリケーションのユースケースをサポートしていますが、Google はウェブ アプリケーションの OAuth のみをサポートしています。

スタートガイド

登録

Google Data APIs で OAuth を使用するには、事前に少し設定を行う必要があります。OAuth リクエストはすべてデジタル署名されている必要があるため、まずドメインを登録し、公開証明書を Google にアップロードする必要があります。詳細については、ウェブベース アプリケーションの登録登録モードで使用する鍵と証明書の生成をご覧ください。

署名リクエスト

ドメインが登録されると、リクエストの署名を開始できます。OAuth の最も難しい概念の 1 つは、oauth_signature を適切に構築する方法と、署名ベース文字列の概念です。ベース文字列は、秘密鍵で署名するデータ(RSA_SHA1 を使用)です。結果は oauth_signature に設定する値になります。

リクエスト例

GET ユーザーの Google カレンダーのリスト(http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime

ベース文字列の形式 base_string = http-method&base-http-request-url&normalized-string-of-oauth_parameters
基本文字列の例 GET&http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull&oauth_consumer_key%3Dexample.com%26oauth_nonce%3D4572616e48616d6d%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D137131200%26oauth_token%3D1%252Fab3cd9j4ks73hf7g%26oauth_version%3D1.0%26orderby%3Dstarttime
HTTP リクエストの例
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: OAuth oauth_token="1%2Fab3cd9j4ks73hf7g", oauth_signature_method="RSA-SHA1", oauth_signature="wOJIO9AvZbTSMK%2FPY%3D...", oauth_consumer_key="example.com", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d", oauth_version="1.0"

: これは単なる表現です。oauth_signature が大幅に長くなります。

ベース文字列に関する注意事項:

  • orderby=starttime クエリ パラメータは、残りの oauth_* パラメータとともに、辞書式バイト値の順序で並べ替えられます。
  • この文字列には「?」文字も含まれていません。
  • base-http-request-url 部分には、URL エンコードされたベース URL(http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull)のみが含まれます。
  • oauth_token は二重に URL エンコードされています。

Authorization ヘッダーに関する注意事項:

  • Authorization ヘッダーでは、oauth_* パラメータの順序は重要ではありません。
  • ヘッダーには、ベース文字列のように orderby=starttime は含まれていません。このクエリ パラメータは、リクエスト URL の一部として保持されます。

OAuth を使用したリクエストの署名について詳しくは、OAuth リクエストの署名をご覧ください。

AuthSub との違い:
比較として、セキュアな AuthSub を使用した同じ例を次に示します。

ベース文字列の形式 base_string = http-method http-request-URL timestamp nonce
基本文字列の例
GET http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull%3Forderby%3Dstarttime 137131200 4572616e48616d6d
HTTP リクエストの例
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: AuthSub token="GD32CMCL25aZ-v____8B" data="GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime 137131200 4572616e48616d6d" sig="MCwCFrV93K4agg==..." sigalg="rsa-sha1"

AuthSub を使用したリクエストの署名について詳しくは、AuthSub リクエストの署名をご覧ください。

OAuth Playground ツール

目的

一部のユーザーは、OAuth の学習曲線が高いと指摘しています。Google の他の認証 API と比較すると、そのとおりです。OAuth の利点は、アプリを拡張して他の(Google 以外の)サービスを使用する場合に明らかになります。さまざまなサービス プロバイダとその API で動作する認証コードを 1 つ記述できるのは、非常に便利です。今このプロトコルを学習しておけば、後で必ず役に立ちます。

OAuth Playground は、デベロッパーが OAuth の問題を解決するのに役立つツールとして私が作成したものです。Playground を使用すると、問題のデバッグ、独自の実装の確認、Google Data APIs のテストを行うことができます。

処理内容

  1. OAuth 認証フロー(リクエスト トークンの取得、トークンの承認、アクセス トークンへのアップグレード)を示します。
  2. 各リクエストの正しい署名ベース文字列を表示します。
  3. 各リクエストの正しい Authorization ヘッダーを表示します。
  4. 認証済みの Google データフィードを操作するために oauth_token を使用する方法を示します。GET/POST/PUT/DELETE データを取得できます。
  5. 認証済みフィードをブラウザで直接表示します。
  6. 独自の oauth_consumer_key(登録済みドメイン)と秘密鍵をテストできます。
  7. oauth_token で利用できる Google データフィード サービスを確認します。

デモ実行

ステップ 1: スコープを選択する

まず、1 つ以上のスコープを選択して、使用する API を決定します。このデモでは、Blogger Google コンタクトで動作するトークンをリクエストしています。

AuthSub との類似性:
AuthSub でも、トークンがアクセスできるデータの範囲を制御するために scope パラメータが必要です。Google は、OAuth 仕様で提案されているとおりにこのパラメータを実装しています。

ステップ 2: OAuth パラメータと設定を変更する

現時点では、[Modify the OAuth Parameters] ボックスの設定は変更しないでください。後で、oauth_consumer_key を登録済みのドメインに変更し、[独自の秘密鍵を使用] をクリックして秘密鍵を入力することで、独自の秘密鍵でテストできます。テスト用の秘密鍵のみを使用してください。

: ここで編集できるフィールドは oauth_signature_methodoauth_consumer_key のみです。oauth_timestampoauth_nonceoauth_token は自動的に生成されます。

RSA-SHA1 に加えて、oauth_signature_methodHMAC-SHA1 を使用することもできます。その場合は、Playground に追加のボックスが表示され、そこに独自の oauth_consumer_key とコンシューマー シークレットを入力する必要があります。これらの値は、登録済みドメインの https://www.google.com/accounts/ManageDomains ページで確認できます。

AuthSub との違い:
安全な AuthSub では、ドメイン名を明示的に設定するパラメータはありません。ドメインは next URL パラメータの一部として含まれます。OAuth には oauth_consumer_key というパラメータがあります。登録したドメインに設定します。

ステップ 3 ~ 5: アクセス トークンを取得する

OAuth アクセス トークンを取得するには、次の 3 つの手順があります。最初の手順は、リクエスト トークンを取得することです。これにより、Google はアプリが OAuth フローを開始したことを認識します。

まず、[Get the Token] ボックスの [Request token] ボタンをクリックします。

特定のフィールドにデータが入力されます。

  • [署名ベース文字列] には、oauth_signature パラメータの作成に使用されたベース文字列の正しい形式が表示されます。
  • [Authorization header] には、リクエストに対応する Authorization ヘッダーが表示されます。
  • [Modify the OAuth Parameters] ボックスに、リクエストで送信された oauth_nonceoauth_timestamp の値が入力されています。
  • oauth_token 入力には、レスポンスの本文で返された対応する値が入力されました。また、Playground には、現在使用している oauth_token のタイプも表示されます。現時点では、リクエスト トークンです。

次に、[トークンを取得] ボックスの [承認] ボタンをクリックします。

この認証ページで、[アクセスを許可] ボタンをクリックしてリクエスト トークンを認証し、OAuth Playground にリダイレクトします。

AuthSub との類似性:
この認証ページは AuthSub と同じです。

AuthSub との違い:
AuthSub の next URL パラメータは oauth_callback パラメータに相当します。OAuth では oauth_callback が省略可能である点が異なります。ユーザーが [アクセスを許可] ボタンをクリックすると、リクエスト トークンが承認され、https://www.google.com/accounts/OAuthGetAccessToken へのトークンのアップグレードを非同期で実行できます。

ヒント: ウェブ アプリケーションを作成する場合は、oauth_callback URL を指定することをおすすめします。ユーザー エクスペリエンスが向上します。

最後に、[Get the Token] ボックスの [Access token] ボタンをクリックします。

この操作により、承認済みのリクエスト トークン(赤色の「アクセス トークン」ラベルで示されています)がアップグレードされます。

新しいトークンを取得する場合は、[start over] をクリックして OAuth ダンスを再開します。

これで、面白いことができるようになりました。

アクセス トークンを使用する

これで、フィードのクエリ、データの挿入、更新、削除を行う準備が整いました。最後の 3 つの HTTP メソッドは、実際のデータを操作するため、実行する際は注意してください。

ヒント: アクセス トークンで利用できるフィードを確認するには、[利用可能なフィード] ボタンをクリックします。

クエリの例を次に示します。GET http://www.blogger.com/feeds/1982051675575479214/posts/default?max-results=3

この例では、特定のブログの投稿を 3 件以下返します。構文がハイライト表示された領域の下にある [ブラウザで表示] リンクをクリックすると、返されたフィードやエントリをブラウザで直接表示することもできます。

例: 投稿を更新する方法

  1. 更新する投稿で rel="edit" を含む <link> 要素を見つけます。次のようになります。
    <link rel="edit" href="http://www.blogger.com/feeds/1982051675575479214/posts/default/8138973184593279875"/>

    [Enter a Google Data feed](Google データフィードを入力)に href URL を貼り付けます。

  2. 構文がハイライト表示されたパネルの上部にある [view plain] をクリックして、既存のエントリの XML をコピーします。ヘッダーではなく、レスポンスの本文のみをコピーします。
  3. HTTP メソッドのプルダウンを PUT に変更します。
  4. そのプルダウンの下にある [enter post data](投稿データを入力)をクリックし、ポップアップに <entry> XML を貼り付けます。
  5. [実行] ボタンをクリックします。

サーバーは 200 OK で応答します。

ヒント: edit リンクを手動でコピーする代わりに、[構文のハイライト表示] チェックボックスをオフにします。クエリの実行後、XML レスポンス本文内のリンクをクリックできるようになります。

まとめ

AtomPub/Atom Publishing ProtocolGoogle Data APIs の基盤となるプロトコル)や OAuth などのテクノロジーは、ウェブの発展に貢献しています。これらの標準を採用するサイトが増えるにつれて、デベロッパーはより多くのメリットを得られるようになります。キラーアプリの作成が突然難しくなります。

OAuth Playground や Google API での OAuth の使用についてご質問やご意見がある場合は、G Suite APIs and Marketplace APIs Support Forum にアクセスしてください。

リソース