在验证OmniAuth之前显示视图

时间:2015-11-14 21:42:45

标签: ruby-on-rails ruby-on-rails-4 omniauth

我想为社交网络创建一个登录名,例如Twitter,Facebook等。

但有像twitter这样的社交网络没有给我发电子邮件。

在保存用户以显示表单视图添加电子邮件的位置然后保存Twitter +电子邮件的所有数据之前,我该怎么办?

1 个答案:

答案 0 :(得分:0)

我将假设您知道如何设置omniauth,因此我将直接跳到相关部分。

在回调中,如果找到指定的uid和提供者的用户,则签署并重定向。否则,您需要在会话中存储omniauth有效负载,并重定向到用户可以添加电子邮件的表单:

def twitter
  if User.find_by(provider: auth.provider, uid: auth.uid)
    # sign in user and redirect
  else
    session[:omniauth] ||= {}
    session[:omniauth][auth.uid] = auth
    redirect_to new_omniauth_email_request_path(ominauth_uid: auth.uid)
  end
end

private

def auth
  request.env['omniauth.auth']
end

将其添加到routes.rb时:

resources :omniauth, only: [], param: :uid do
  resource :email_request, only: [:new, :create]
end

您将拥有以下两条新路线:

omniauth_email_request     POST  /omniauth/:omniauth_uid/email_request(.:format)       email_requests#create
new_omniauth_email_request GET   /omniauth/:omniauth_uid/email_request/new(.:format)   email_requests#new

您需要创建EmailRequestsController并实施newcreate操作。在成功创建用户后,不要忘记清除会话:

def create
  # ...
  @user = User.create do |user|
    user.email = params['email']
    user.uid = params['omniauth_uid']
    user.name = session[:omniauth][user.uid].name
    # assign whatever else you may need from session[:omniauth][user.uid]
  end

  session[:omniauth].delete @user.uid if @user.persisted?
  # ...
end

请注意,如果您计划支持多个omniauth提供程序,那么在"中间步骤"用户可以提供已经存在于数据库中的电子邮件(例如,用户已经通过传递电子邮件的一些其他omniauth进行了身份验证)。这种情况需要处理。