omn​​iauth多步注册

时间:2014-05-06 21:39:56

标签: ruby-on-rails ruby devise omniauth

我已按照此tutorial获得了与谷歌合作的omniauth。我目前遇到的问题是,我们不是在用户注册时创建用户,而是将其路由到完成注册页面,在那里他们必须输入其他数据。这类似于pastebin处理其oauth注册的方式。

UserModel(取自教程):

def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
  data = access_token.info
  user = User.where(:provider => access_token.provider, :uid => access_token.uid ).first

  if user
    return user
  else
    registered_user = User.where(:email => access_token.info.email).first

    if registered_user
      return registered_user
    else
      user = User.create(name: data["name"],
      provider:access_token.provider,
      email: data["email"],
      uid: access_token.uid ,
      password: Devise.friendly_token[0,20],
      )
    end
  end
end

omniauthCallBacksController

class OmniauthCallbacksController < Devise::OmniauthCallbacksController   
  def google_oauth2
    @user = User.find_for_google_oauth2(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.google_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

1 个答案:

答案 0 :(得分:0)

看起来问题是您的find_for_google_oauth2正在创建用户。这意味着else回调中的google_oauth2没有被点击,因此它永远不会转到您的new_user_registration_url。一种解决方案是分离查找和创建步骤,而不是将它们组合在find_for_google_oauth2中。然后,当查找找不到现有用户时,您点击了else回调中的google_oauth2,并将omniauth数据放入会话中,然后您就会收到new_user_registration_url。然后,一旦他们输入了额外信息并提交表单,您就可以使用它与您在会话中保存的omniauth数据一起创建用户。

将omniauth数据放入会话中的两件事:

  1. 您可能希望从omniauth哈希中选择您想要保留的内容(特别是如果您将CookieStore用于会话存储),因为它非常大。
  2. 如果您正在使用CookieStore和Rails&lt; 4然后存储在会话中的omniauth数据(即在用户计算机上的cookie中)未加密。