Gemfile为:
gem 'ruby-openid'
gem 'rack-openid'
sessions_controller.rb的代码:
class SessionsController < ApplicationController
def new
flash[:returnurl] = params[:returnurl] if params[:returnurl]
response.headers['WWW-Authenticate'] = Rack::OpenID.build_header( #build身份验证header,跳转到OpenID认证url
:identifier => "https://www.google.com/accounts/o8/id", #这里hard code了Google的OpenID url,测试后会加上别的如新浪围脖/豆瓣等
:required => ["http://axschema.org/contact/email"], #返回OpenID帐号的email
:return_to => sessions_url, #返回为post create action
:method => 'POST')
head 401 #状态码为401
end
def create
if openid = request.env[Rack::OpenID::RESPONSE]
case openid.status
when :success
ax = OpenID::AX::FetchResponse.from_success_response(openid)
identify_url = openid.display_identifier
email = ax.get_single('http://axschema.org/contact/email') # 得到OpenID帐号的email
user = User.where(:email => email).first || User.new
user.email = email
user.identify_url = identify_url
log_in(user)
redirect_to(flash[:returnurl] || root_path)
when :failure
render :action => 'problem'
end
else
redirect_to new_session_path
end
end
end