«前の日記(2006-05-16 (火)) 最新 次の日記(2006-05-22 (月))»  

まちゅダイアリー


2006-05-21 (日)

はてな認証APIで tDiary にログイン

tDiary の日記を書く画面 (update.rb) は、 Basic 認証で保護するようになっている。 これを、はてなの認証APIを使って認証するように改造してみた。

(2006/06/18 追記) 新しいバージョンを公開した。

  • 認証されていなければ、はてなの認証画面へリダイレクトして認証する(はてなIDを取得する)。
  • ユーザIDが、設定ファイル (tDiary.conf) に書かれている管理者名(はてなID)と一致することを確認する。
  • 一致すればセッションクッキーを発行し、日記の編集画面へ。一致しなければエラーを表示する。

はてなの認証APIを使うメリットは、「Basic認証の設定がいらないので、設置が楽になるかも」、「Basic認証が動かないサーバでも動かせる」、「ログアウトができる(まだ実装してない)」、「認証した人だけにツッコミを許可するなどの応用ができる(実装してない)」など。 逆にデメリットは、「携帯からの編集が(おそらく)できない」、「はてなサーバが落ちていたら日記が書けない(!)」、「はてながサービス終了したら(略)」などなど。

んで、時間が取れれば、今後やってみたいこと。 他の認証APIへの対応や訪問者側への応用ができたら、いろいろと面白そう。

  • 他の認証API (Flickr, TypeKey) への対応
  • ログアウト機能の実装
  • 訪問者側への認証への応用(ツッコミなど)
  • セッションのゴミが /tmp に残る問題への対処

ダウンロード

参考までに、今の時点でのファイルを公開。

セキュリティ上の問題点がある可能性もある(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 )
Tags: tDiary hatena