はてな認証APIで tDiary にログイン
tDiary の日記を書く画面 (update.rb) は、 Basic 認証で保護するようになっている。 これを、はてなの認証APIを使って認証するように改造してみた。
(2006/06/18 追記) 新しいバージョンを公開した。
- 認証されていなければ、はてなの認証画面へリダイレクトして認証する(はてなIDを取得する)。
- ユーザIDが、設定ファイル (tDiary.conf) に書かれている管理者名(はてなID)と一致することを確認する。
- 一致すればセッションクッキーを発行し、日記の編集画面へ。一致しなければエラーを表示する。
はてなの認証APIを使うメリットは、「Basic認証の設定がいらないので、設置が楽になるかも」、「Basic認証が動かないサーバでも動かせる」、「ログアウトができる(まだ実装してない)」、「認証した人だけにツッコミを許可するなどの応用ができる(実装してない)」など。 逆にデメリットは、「携帯からの編集が(おそらく)できない」、「はてなサーバが落ちていたら日記が書けない(!)」、「はてながサービス終了したら(略)」などなど。
んで、時間が取れれば、今後やってみたいこと。 他の認証APIへの対応や訪問者側への応用ができたら、いろいろと面白そう。
- 他の認証API (Flickr, TypeKey) への対応
- ログアウト機能の実装
- 訪問者側への認証への応用(ツッコミなど)
- セッションのゴミが /tmp に残る問題への対処
ダウンロード
参考までに、今の時点でのファイルを公開。
- http://www.machu.jp/dist/tdiary_auth-20060521 (ソースだけ見たい人向け)
- http://www.machu.jp/dist/tdiary_auth-20060521.tar.gz (上記のアーカイブ)
セキュリティ上の問題点がある可能性もある(XSSには対応したつもりだけど、CSRFは不安)ので、万一導入する場合はかなりの覚悟が必要。 このサイトでも試しに使っているけど、正直怖い(笑)。 まぁ、こんなこともできるよ、というサンプルとしてどうぞ。
導入方法
- update.rb を本体に差し替える
- auth.rb を tdiary/ ディレクトリの下にコピーする
設定ファイルには、以下の3行を追加する。 api_key と secret は「はてな認証API」のページから取得する。 コールバックURLは、設定画面のURLにしておくこと。
@options['author'] = 'kmachu' @options['api_key'] = '' @options['secret'] = ''
補足
本体への差分は以下のとおり。 思ったよりも差分が少なかった。
$ svn diff update.rb Index: update.rb =================================================================== --- update.rb (リビジョン 2679) +++ update.rb (作業コピー) @@ -16,13 +16,17 @@ end $:.unshift( org_path.untaint ) require 'tdiary' + require 'tdiary/auth' @cgi = CGI::new + @session = CGI::Session.new(@cgi) conf = TDiary::Config::new(@cgi) tdiary = nil begin - if @cgi.valid?( 'append' ) + if !@session['author'] || @session['author'] != 'true' + tdiary = TDiary::TDiaryLogin::new( @cgi, '', conf, @session ) + elsif @cgi.valid?( 'append' ) tdiary = TDiary::TDiaryAppend::new( @cgi, 'show.rhtml', conf ) elsif @cgi.valid?( 'edit' ) tdiary = TDiary::TDiaryEdit::new( @cgi, 'update.rhtml', conf )