2009.07.16

smart.fm

smart.fm OAuth が OAuth 1.0a に対応します。(+OAuth 1.0a 対応方法概要)

ruby oauth gem も rails oauth plugin も OAuth 1.0a 対応になったので、smart.fm も OAuth 1.0a に対応することにしました。

実装は既に終わったので、予定通りだと明日の昼前に本番に反映される予定です。

OAuth の脆弱性が発見されてから、暫定的に以下の2つの制約を加えましたが、OAuth 1.0a 対応でどちらの制約も外れます。

  1. authorize 時に渡される oauth_callback を無視
  2. request token の有効期間もかなり短く

ただし OAuth 1.0a では oauth_callback を指定するタイミングが authorize 時から get request token 時に変更になっているので、authorize 時に oauth_callback 渡しても無効、というのは変わりません。

もちろん従来のフローでアクセスする consumer に対する動作は変わらないので、oauth_callback を利用しない場合は特に consumer 側の変更は必要ありません。consumer 登録時に登録する oauth_callback は、従来通り有効です。

同時に smart.fm で利用している Yahoo! / Google / Twitter の OAuth でも 1.0a を利用するように変更したので、ruby の場合の OAuth 1.0a への変更点をまとめておきます。

OAuth を利用されている smart.fm API developer の方で oauth_callback を指定したい方は、こちらを参考に該当部分のコードを変更していただければと思います。

get request token 時に oauth_callback を指定

consumer.get_request_token(:oauth_callback => callback)

authorize されて帰って来た時に oauth_verifier を取得

callback の query に oauth_token に加えて oauth_verifier が帰ってくるので、session なりに保存します。(get request token で oauth_callback を指定した時のみ、この oauth_verifier が必要になります)

get access token 時に oauth_verifier を利用

request_token.get_access_token(:oauth_verifier => oauth_verifier)

補足

OAuth 1.0a 未対応のサービスと共存させる為には、authorize_url を生成する場所で以下のようにやってやれば OK です。

authorize_url = if request_token.callback_confirmed?
  # Serveice Provider is supporting OAuth 1.0a
  request_token.authorize_url
else
  request_token.authorize_url + "&oauth_callback=#{callback}"
end

ps.
oauth plugin はそのままだと OAuth 1.0a にしか対応していないので、この plugin を利用している SP の皆様はお気をつけを。