Google Data API と OAuth の併用

Google Data API チーム Eric Bidelman
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 を理解するには、その用語を理解する必要があります。 OAuth の仕様と Google のウェブ アプリケーション用の OAuth 認証に関するドキュメントは、特定の定義に大きく依存しています。そのため、Google の OAuth 実装における各定義の意味を明確にします。

  1. 「OAuth ダンス」

    OAuth 認証/認可プロセス全体を表す非公式の用語。

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

    アプリケーションがいずれかの Google Data API へのアクセスをリクエストしていることを Google に知らせる初期トークン。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 との類似点:
    承認済みリクエスト トークンのアクセス トークンの交換は、1 回限りの AuthSub トークンを有効期間が長いセッション トークン(それぞれ https://www.google.com/accounts/AuthSubRequestTokenhttps://www.google.com/accounts/AuthSubSessionToken)にアップグレードすることに似ています。違いは、AuthSub には最初のリクエスト トークンのコンセプトがないことです。代わりに、ユーザーは AuthSubRequestToken 認証ページからトークン プロセスを開始します。

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

    Google Data API の場合、このプロバイダは Google です。通常、サービス プロバイダは、OAuth エンドポイントを提供するウェブサイトまたはウェブサービスを示すために使用されます。OAuth サービス プロバイダのもう 1 つの例は MySpace です。

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

    ユーザーのデータ(アプリケーション)へのアクセスをリクエストするプログラム。OAuth プロトコルは柔軟で、さまざまな種類のクライアント(ウェブ、インストール、デスクトップ、モバイル)に対応しています。

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

スタートガイド

登録

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

署名リクエスト

ドメインが登録されると、リクエストに署名する準備が整います。OAuth の最も難しいコンセプトの一つは、oauth_signature を適切に構成する方法と、署名のベース文字列の概念です。ベース文字列は、RSA_SHA1 を使用して秘密鍵で署名したデータです。その結果は、oauth_signature に設定した値です。

リクエストの例

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

ベース文字列の形式 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 で機能する単一の認証コードを記述することが、非常にうまくいっているように思われます。プロトコルの学習には、後ほどお礼を申し上げます。

OAuth Playground は、デベロッパーが OAuth の困難を克服するために作成したツールです。 プレイグラウンドを使用すると、問題のデバッグ、実装の確認、Google Data API のテストなどに役立ちます。

処理内容

  1. リクエスト トークンの取得、トークンの承認、アクセス トークンへのアップグレードという OAuth 認証フローについて説明します。
  2. 各リクエストの正しい署名ベース文字列を表示します。
  3. リクエストごとに正しい Authorization ヘッダーを表示する。
  4. oauth_token を使って、認証済みの Google データフィードを操作する方法を示します。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 のパラメータや設定を変更する

今は、[OAuth パラメータを変更] ボックスで設定を変更しないでください。後で独自の秘密鍵でテストを行うには、oauth_consumer_key を登録済みのドメインに変更し、[独自の秘密鍵を使用] をクリックして秘密鍵を入力します。TEST 秘密鍵のみを使用してください。

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

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

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

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

OAuth アクセス トークンを取得するには 3 つのステップがあります。まず、リクエスト トークンを取得します。これにより、アプリケーションが OAuth ダンスを開始していることが Google に通知されます。

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

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

  • [署名の基本文字列] には、oauth_signature パラメータの作成に使用する基本文字列の適切な形式が表示されます。
  • 「Authorization ヘッダー」には、リクエストに対応する Authorization ヘッダーが表示されます。
  • [OAuth パラメータを変更する] ボックスに、リクエスト内で送信された oauth_nonceoauth_timestamp の値が入力されます。
  • oauth_token 入力には、レスポンスの本文で返された対応する値が入力されていました。プレイグラウンドには、現在利用できる 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] ボタンをクリックします。

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

新しいトークンを取得する場合は、[やり直す] をクリックして 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"/>

    [Google データフィードを入力] の入力欄に href URL を貼り付けます。

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

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

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

まとめ

ウェブの発展には、AtomPub/Atom Publishing ProtocolGoogle Data API の基盤となるプロトコル)や OAuth などのテクノロジーが役立ちます。 これらの基準を採用するサイトが増えれば、開発者が優勝です。殺人アプリを作成するのは次第に困難になります。

OAuth Playground や、Google API で OAuth を使用するにあたってご不明な点やご意見などありましたら、G Suite API と Marketplace API のサポート フォーラムをご利用ください。

リソース