`
wuhuizhong
  • 浏览: 667912 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

使用Google账户登录的实现代码

    博客分类:
  • ROR
阅读更多

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
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics