URL:http://uncorrelated.no-ip.com/20100508.shtml

ゲリラ的 uncorrelated のウェブページ

JavaでOAuthを使え!

Twitterの普及とともに、サード・パーティのウェブサイトやアプリケーションから、Twitterに投稿をするサービスが広まってきた。ブックマークをした時、Blogを公開したときなど、様々なイベントでTwitterに投稿を行えるようになっている。このようなマッシュ・アップは便利で楽しい反面、TwitterのIDやパスワードをサード・パーティのサービスに登録しなければいけないのが問題であった。

もし悪意のあるサービスにパスワードを登録してしまったら、Twitterのアカウントがのっとられてしまう可能性がある。Twitterに限らず、パスワード登録なしでサードパーティーとサービスを利用してもらう方法を提供するのがインターネット・サービス会社の課題であり、それに対する回答としてOAuthが策定された。このOAuthは、2006年から2007年に仕様が策定され、2009年にセキュリティー・ホールが発見・悪用され改定されて現在に至り、実用段階の仕様となっている。

さて、最近流行りのOAuthのウェブサービスを利用したい人は多々いるであろう。ところがOAuthはPHPでの利用例は山ほどあるのだが、Google CodeのOAuthのサンプルコードや、signpostなどのライブラリ群があるのにも関わらず、Javaに限ると実は十分ではない。特に、何故かコールバックを利用するウェブ・アプリケーション向けのサンプルが多く無い状況となっている。確かにコールバックさせると、処理手順が複雑になるのでサンプル・アプリケーションが複雑になるから、ちょっと説明しづらいのかも知れない。実際にcallbackさせる手順でsignpostを使ってみた所、幾つかポイントとなるところがあったのでまとめておく。

1. OAuthの状態遷移は3相

認証前、認証後の2相のように思われるが、コールバックする場合は実際のところは3相である。

1. 認証前〜oauth_verifierを要求
OAuthの認証が行われていない状態。
コールバックされたときにConsumerを復元できるように、(リクエスト・トークンである)TokenとTokenSecretを保存する一方、provider.setOAuth10a(true)を行う必要がある(これはコールバックを行う場合は、他のフェーズでも同様)。
2. コールバック〜初回のOAuth Providerの提供するAPIリクエスト
callback待ちの状態。
callbackされたGET引数のoauth_verifierの値を第2引数として、provider# retrieveAccessToken()を行う必要がある。
またAPIをリクエストするのに、consumer.sign()を行う必要がある。
TokenとTokenSecretは(アクセス・トークンに)更新されるので、保存しなおす。
3. 2回目以降のAPIリクエスト
認証完了後の状態。
APIのリクエストを随時行える。
consumer.sign()は必要なくなるし、TokenとTokenSecretも更新されない。

フェーズ2の手順を、フェーズ3で行うと不正な認証として例外が発生する。

signpostの例だと、コールバック無しでフェーズ2までしか行っていないので、文書の少なさもあって利用者は混乱するかも知れない。signpost自体はコールバック時の処理をサポートしているのだが、付属の例がキャッチアップしていないのが、ちょっと残念だ。

2. コールバックは単なるリダイレクト

OAuth Providerから、OAuth Consumerに対して直接httpの接続が行われる事は無い。ローカル環境でも実行ができるので、開発はしやすい。

3. API呼び出し時の400番台のhttpステータスコードなどの処理

Twitterの場合、無効なTokenとTokenSecretを用いてAPIを呼び出した場合、401番が戻る。また、規格上、無効なTokenとTokenSecretをsignpostライブラリで用いるとOAuthNotAuthorizedExceptionが発生する。この2つが発生した場合は、フェーズ1に戻って処理を行う必要がある。

上記とは別に、連続投稿とみなされる場合などで、403番のhttpステータスコードが戻る場合がある。この場合は処理はTokenとTokenSecretは有効なので、フェーズ3のままで処理を行うことができる。

4. 他のライブラリへの依存

Apache commons codecは必須で、Apache HTTP Componentsは推奨となる。どちらもライセンス的には扱いやすいモノだが、設置を忘れると動かない。

まとめ

Twitterが流行っている間は、何でもかんでもマッシュアップするリクエストが出てくると思うので、OAuth Consumerを手軽に作れるsignpostライブラリは重宝するだろう。 Twitter以外にもGoogle Calendar APIなどもOAuthなどで、今後もOAuth対応サービスは増加すると思われる。Apache HttpComponentsにも対応している(厳密には、Java標準のHTTP APIではMultipart MIMEの関係で問題がある)など、Androidアプリケーションでの利用なども考慮されているので利用範囲は広い。

何はともあれ、手抜き手軽で便利そうなサイトを作れる可能性があるので、OAuth Providerにも、OAuthライブラリ提供者にも感謝したい。こういうプロトコルを自分で考えて実装なんて、とてもじゃないけどしていられないですヽ(´д`)ノ

参考ページ

  1. oauth-signpost - Project Hosting on Google Code
  2. FrontPage - TwitterまとめWiki
  3. Twitter APIでOAuth認証を利用する方法(Javaの場合) by Inquisitor
  4. GoogleのOAuthを試してみた (Java編) | スマートネットワーク 開発ブログ
  5. 無題メモランダム: Google App Engine + Twitter + OAuthでTwitterにつぶやくためのメモ

注意

  1. 本ページは、本当に投げやりに書いています。
  2. 本サイトは、24時間運用ですが、事前に告知無くサーバーが停止するときもあります。必要な情報はメモをしてください。
  3. チャット友達へのページです。不愉快な思いをしても著者は責任を負いません。

過去ログ
最新版
01.24
01.17
12.25
10.23
05.08
04.11
02.21
02.15
...MORE!

全文検索
画像板
投票CGI
ゲーム
パズル
マーカー
会員登録
会員専用

RSS1.0
RSS 1.0