使用Google账户登录的实现代码
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 endend?