そういえば、貧困な思考はいつも あなたのパターンを 安易なイメージ処理して のところの最後をしばらくの間「アニメーションにして」と勘違いしていた。

  1. トップ
  2. music
  3. 遊体離脱の空耳

めんどくさがって例外処理しなくても http://static.flickr.com/0/buddyicons/ 以下は全てリダイレクト。

アイコンが設定されていないときは、特別に http://www.flickr.com/images/buddyicon.jpg をアイコンとして使うんだけど、なんとなく面倒くさくてこの処理をしていなかった。というか、どういうレスポンスが返ってくるかわからなかったから放置していた。

で、なんとなくアレしてコレして見てみたら、iconserver=0 がレスポンスされるらしい。例外処理しとくかーって思ったけどリダイレクトだった。細かい配慮ないす。

  1. トップ
  2. net
  3. Flickr は親切だった。

weblogin.rb, 名前失敗したけどもういいや。

そのうち忘れるので使い方をめもる。

@cgi.header を使うことを前提にしてる。

api_keys = {
"Flickr" => {
"api_key" => "Flickr70c55b82e10021ffaaapi_key6",
"secret"  => "Flickrdf5secret3"
},
"TypeKey" => "fsakfsTypeKeyafasAPI"
}
require "weblogin.rb"
@cgi = CGI.new
WebLogin.open(@cgi, api_keys) do |login|
begin
case login.auth
when :login
# login したときの処理
# DB にユーザ ID とユーザ情報を保存したり
end
rescue WebLogin::NoActionError => e
puts @cgi.header("type" => "text/plain")
puts login.services # 有効なサービスの配列
end
end

上のようなのを認証スクリプトとしておいとく。このサイトだと /login.rb がコレ。ログインスクリプトの query_string が logout だったらセッションを破棄してリファラにリダイレクトする。ちょっとアレ。

/login.rb/Flickr?return_path= のようなリクエストをすると Flickr にリダイレクトして認証させる。認証されるとコールバック (Flickr の対応する API key のコールバックには http://example.com/login.rb/Flickr/callback のように指定しておく) にリダイレクトされるので、セッションに情報をセットして、return_path にリダイレクトする。

login.auth は、path_info に何も指定されていなかったりすると NoActionError を投げる。

require "weblogin.rb"
@cgi = CGI.new
WebLogin.open(@cgi, api_keys) do |login|
if login.service
# login している場合
login.service #=> "Flickr"
login.id #=> "25514198@N00"
login.user_name #=> "cho45"
login.profile_uri #=> "http://www.flickr.com/photos/25514198@N00/"
login.icon #=> "http://static.flickr.com/23/buddyicons/25514198@N00.jpg"
login.full_name #=> "Hiroh Satoh"
else
# login していない場合
# id その他上記メソッドは全て nil
end
end

いまいち気持ち悪いんだけどどうにもこうにもわからんのでこんな感じ。ブロックをとっているのはセッションファイルを確実に閉じるため。fcgi 環境で死ぬことがあったのでこういうことやってる。

WebLogin クラスは、それ以下にある、サービス名に対応するクラスをインスタンス化してメソッドを呼び出す。例えば /login.rb/Flickr?return_path=somepath の場合、WebLogin::Flickr.new(@cgi, @session, @api_keys["Flickr"]).auth が呼ばれる。

各サービス名の auth メソッドはサービスの認証画面にリダイレクトする。サービスは /login.rb/Flickr/callback にリダイレクトする。

callback が指定されている場合、インスタンス化されたサービスクラスの callback メソッドを呼ぶ。callback メソッドはユーザ情報をまとめて Hash にして返す。WebLogin はその Hash をセッションに保存して、最初に指定された return_path にリダイレクトする。

いろいろアレなことが思い浮かんだけどあとで考えよう。

new にブロックって一般的じゃないんじゃ?という指摘をうけたので open にした。確かに new にブロックは微妙だった。

  1. トップ
  2. ruby
  3. ログインに使ってるスクリプト