2009年12月16日水曜日

GData APIの認証に触れてみる

Webアプリケーションを開発する際に、Googleを始めとした様々なWebのサービスを利用する機能を実装することが多くなってきたのではないでしょうか。その際に必要なAPIが各サービスプロバイダから公開されているケースが多く、手軽に試すことが可能です。
 GoogleのGData APIでは、Java、JavaScript、.Net、PHP、Python、Objective-Cといった様々な言語で開発するアプリケーションから、Googleのサービスのデータを利用出来ます。
http://code.google.com/intl/ja/apis/gdata/docs/client-libraries.html
 業務アプリケーションで、Google Apps上のGoogle Calendarと連携を行うといったケースは十分に考えられますし、Google Docsのデータを用いて最近、話題になっているGoogle Visualization APIを利用しグラフを表示するといった面白そうな事例も今後、増えてくるのではないでしょうか。
 一般にこうしたアプリケーションを開発する際に、各サービスの認証を考慮することは避けては通れません。
 例えば、開発対象のアプリケーションを利用してユーザーがGoogle Calendarの自分の予定を閲覧する、あるいはBloggerの記事を投稿するといったことを実現する場合、ユーザーに自分のアカウントを認証してもらう必要があります。
 GData APIでは認証する際に四つの方法が用意されています。
  • Authentication for Web Applications: AuthSub
  • Authentication for Web Applications: OAuth
  • Authentication for Installed Applications: ClientLogin
  • Authentication for Gadgets
 上記リンク先の利用目的で分類されているように、WebアプリケーションではAuthSub、OAuth、インストールを要するデスクトップアプリケーション等ではClientLogin、ガジェットからはOAuth Proxyを用いて認証を行うことが示されています。
 ClientLoginではアプリケーション上でユーザーにGoogleアカウントの情報(ユーザーIDとパスワード)を登録してもらい、それを利用して認証を行います。
 Webアプリケーションの場合、ClientLoginのように直接、アプリケーション上でユーザーIDとパスワードを登録してもらうのではなく、別の方法が推奨されています。Google独自のAuthSubと、API認可プロトコルの標準仕様てして策定されているOAuthです。
 これらの認証方法はユーザーから見ると、特定の第三者となるアプリケーション側にパスワードを渡さないことから、セキュリティ上のリスクが低くなると考えられます。
 私の場合、Googleのサービスの認証以前に認証技術そのものが、まだまだ判っていないため、ドキュメントやWebの情報を読むのにも一苦労と勘違いの連続です(^^;こちらの記事は大変、参考になりました。
 AuthSubでは、アプリケーションがGoogleアカウントのサイト上へ認証を要求します。ユーザーがGoogleアカウントのサイト上で認証を行い、認証に成功すると、次に、アプリケーションがユーザーのアカウントのデータにアクセスすることを承認するかどうかを確認します。そして、ユーザーが承認した場合、アプリケーションへリダイレクトされます。この際にパラメーターにGoogleアカウントにより承認された認証トークンが付与されており、これを利用することでアプリケーションはユーザーのデータを参照することが出来ます。
 ClientLogin以外の認証を実現する場合、理解もさることながら実装の手順も複雑ですが、Google Code上にサンプルがあるので非常に助かります。
 AuthSubによる認証のサンプルが用意されています。このサンプルではGoogle Calendarのデータを参照します。
 ※サンプルを実行する場合、以下のjarファイルが必要ですので、パスを通す必要があります。
  • gdata-appsforyourdomain-1.0.jar
  • gdata-base-1.0.jar
  • gdata-calendar-1.0.jar
  • gdata-client-1.0.jar
  • gdata-core-1.0.jar
 ダウンロードはこちらから可能です。gdata-samples.java-1.40.1.zip を選択すると、AuthSubのサンプルも含めたファイルとjarファイルが入手出来ます。 gdata-src.java-1.40.1.zip の中身はソースとjarファイルです。
 ちなみにリリースノートによると、1.40からGoogle Translator Tookkit Data API が利用出来るようになったとのことなので、こちらも楽しみです。
 注意点として、このサンプルをEclipse上でGAE/Jのアプリケーションとして試す場合は、セッションを有効にするため、WEB-INF以下の appengine-web.xml に下記の記述を追加する必要があります。
<sessions-enabled>true</sessions-enabled>
 サンプルの実行画面は下記となります。
 サンプルの sample/authsub/web以下にある index.jsp が sample/authsub/src/LoginServlet を呼び出し、認証がされていなければGoogleのログインページへ遷移され、アプリケーションからカレンダーのデータを参照するかどうかの確認画面が表示されます。
 認証が既に行われていれば、sample/authsub/web以下の main.jsp が表示されますので、認証されたアカウントのGoogle Calendarのデータが参照出来る筈です。
 main.jsp 内ではJavaScriptを利用して、Google Calendarのデータを参照しています。JavaによるGoogle Calendarを利用したサンプルもこちらで見ることが出来ます。認証方法がClientLoginになっていますが、カレンダーへのデータの登録、削除、参照が実装されているようなので、GData APIを利用する参考になるかと思います。ダウンロード可能なサンプルは上記を含め、他のサービスの利用例が確認出来ます。
 手前味噌になりますが、AuthSub認証によるGData APIの利用については、弊社の書籍でP.269からP.276にソースと解説が掲載されています。
 
 また、Webアプリケーションで推奨されるGDataへの認証方法として、もう一つOAuthがあります。OAuthではAuthSubより複雑なやり取りになります。
  • アプリケーション側はGoogleアカウントのサイト上へ認証を要求する前に、リクエストトークンと呼ばれるキーを要求します。この時点で、Googleから渡されるリクエストトークンは未承認の状態です。
  • アプリケーションは未承認のリクエストトークンをパラメータに付与し、Googleアカウントのサイト上へ認証を要求します。
  • Googleアカウントのサイト上で、ユーザーがGoogleアカウントのサイト上で認証を行います。
  • アカウントの認証に成功すると、ユーザーはアプリケーションがアカウントのデータにアクセスすることを承認するかどうかをGoogleアカウントのサイト上で決定します。ユーザーが承認した場合、アプリケーションへリダイレクトされます。この際、パラメーターに認証が成功したことを示すGoogleにより承認されたリクエストトークンが付与されます。
  • アプリケーションは承認されたリクエストトークンを用いてアクセストークンというキーと交換することを要求します。Googleにより交換されたアクセストークンが発行されます。
  • アプリケーションは受け取ったアクセストークンを利用することで、ユーザーのデータを参照することが出来ます。
 ※OAuthの解説によると、データを提供するサービスをサービス・プロバイダー、サービスを利用するアプリケーションをコンシューマと位置づけています。gihyo.jpさんのこちらの記事がとても参考になります。
 この手順の中で、アプリケーション毎のコンシューマーキー、コンシューマーシークレットというキーに加えて、アプリケーションからGoogleへのリクエストが署名されている必要があります。こちらに詳細が記されています。
 また、OAuth_Playgroundというサイトでは、Googleのサービスを利用するリクエストトークンの生成、承認、アクセストークンの取得といったプログラム上で行うべき手順を体験出来ますので、ドキュメントと併せて利用すると参考になるかと思います。
 Google Code上ではOAuthによるGData API利用のサンプルがありますので、試してみてはいかがでしょうか。また、GAE/J上でOAuthによるGData API利用のサンプルがこちらでデモされています。ソースはGoogle Code上のこちらとなります。
 最後に追記しますと、GAEで開発を行う場合、特にGoogle Appsとの連携が要件としてある場合は、ユーザーのロールと認証が複数存在するので、頭の中で整理をしておかないと混乱を招くかもしれません。当Blogのこちらの記事を読まれると理解の一助になるのではないかかと思います。
 (12/17 PM3:15 追記) Twitter上でご指摘を頂いた通り、上記のAuthSubのサンプルをGAE/J上で実行される際に、appengine-web.xml に設定を追加する必要があります。こちら、または、こちらをご確認下さい。どうもありがとうございました。

3 件のコメント:

  1. appengine-web.xmlへのクッキーハンドリングに関する記述追加の件ですが、Eclipese3.5環境では、この記述を追加すると
    Unexpected Exception
    org.eclipse.core.internal.resources.ResourceException: Resource is out of sync with the file system: '/gaejtest/war/WEB-INF/appengine-web.xml'.
    となりデプロイできなくなります。

    返信削除
  2. コメントありがとうございます。
    その例外はEclipseが管理しているリソースと実際のリソースの同期がとれてない場合に起こるものと思われます。これはEclipseのプロジェクト(もしくは対象のファイル)をリフレッシュすることで回避出来るようになるので、お試しください。

    返信削除
  3. おお、なんとこれだけの話でしたか _| ̄|○....
    ありがとうございました!

    返信削除