スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SinatraでOpenIDを使う

タイトルではSinatraと書きつつ、サンプルはPadrinoだったりします。

http://example.com/login/login?openid_identifier=yahoo.co.jp
でアクセスするとYahooでOpenIDの認証を行ってくれて
http://example.com/login/complete
に戻ってきて、セッションに保存した後
http://example.com/main
にリダイレクトしています。

めんどくさいことは、Helperになすりつけたので
コントローラーはだいぶすっきりしました。

openid_helper.rb
#coding: utf-8
require 'tmpdir'
require 'openid'
require 'openid/store/filesystem'
require 'openid/extensions/ax'

class OpenidHelper
ATTRS = {
friendly: 'http://axschema.org/namePerson/friendly',
image: 'http://axschema.org/media/image/default',
email: 'http://axschema.org/contact/email',
firstname: 'http://axschema.org/namePerson/first',
lastname: 'http://axschema.org/namePerson/last',
country: 'http://axschema.org/contact/country/home',
language: 'http://axschema.org/pref/language',
}

def self.get_openid_consumer(session)
store = OpenID::Store::Filesystem.new(Dir.tmpdir)
OpenID::Consumer.new(session, store)
end

def self.exec_openid(session, openid_identifier, realm, callback_url)
openid_request = get_openid_consumer(session).begin(openid_identifier)
ax = OpenID::AX::FetchRequest.new
ATTRS.each_pair do |key, value|
ax.add(OpenID::AX::AttrInfo.new(value, key.to_s, true))
end
openid_request.add_extension(ax)
openid_request.redirect_url(realm, callback_url)
end

def self.make_response(session, params, url)
openid_response = get_openid_consumer(session).complete(params, url)
status = openid_response.status
res = nil
case status
when OpenID::Consumer::FAILURE
res = {status: "failure"}
when OpenID::Consumer::CANCEL
res = {status: "cancel"}
when OpenID::Consumer::SUCCESS
ax_response = OpenID::AX::FetchResponse.from_success_response(openid_response)
claimed = params['openid.claimed_id']
name =
image = ax_response.data['http://axschema.org/media/image/default'][0]
res = {
claimed: claimed,
status: "success",
}
ATTRS.each_pair do |key, value|
data = ax_response.data[value]
res[key] = data.empty? ? nil : data[0]
end
end
res
end
end

login.rb
#coding: utf-8
Pad.controllers :login do
get :login do
openid_identifier = params[:openid_identifier]
root = request.scheme + "://" + request.host
redirect OpenidHelper.exec_openid(session, openid_identifier, root, root + "/login/complete")
end

get :logout do
session[:user] = nil
redirect "/main"
end

get :complete do
result = OpenidHelper.make_response(session, params, request.url)
if "success" != result[:status]
"失敗"
else
session[:user] = result
redirect "/main"
end
end
end
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。