Devise、Omniauth和“new with session”

3

我在我的用户模型中有一个方法(使用 devise 和 confirmable),叫做 new_with_session,这是Omniauth + Devise所需的(https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview):

def self.new_with_session(params, session)
  super.tap do |user|
    if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] || session["devise.google_data"] && session["devise.google_data"]["extra"]["raw_info"]
      user.email = data["email"]
    end
  end
end

用户可以使用Google或Facebook登录,我正在使用此行来保存正确的user.email

if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] || session["devise.google_data"] && session["devise.google_data"]["extra"]["raw_info"]

但我认为这不是正确的方法,所以...

  1. 你知道比使用 || 运算符构建 user.email 更好的方法吗?
  2. 如果我想从 Google/Facebook 保存更多数据,比如用户名,我应该将其添加到自定义的 new_with_session 中吗?如果是,为什么?
2个回答

9

new_with_session被用于build_resource函数中。这个函数与可注册性(registerable)(用户注册表单)一起使用。

仅当您的Facebook/Omniauth会话已经存在并且您想要从omniauth预先填充您的注册表单时,此功能才有用。(假设您没有在回调中自动创建帐户)

# Build a devise resource passing in the session. Useful to move
# temporary session data to the newly created user.
def build_resource(hash=nil)
  hash ||= params[resource_name] || {}
  self.resource = resource_class.new_with_session(hash, session)
end

这就是我需要的知识。 - ahnbizcad

1

您是否想通过Facebook或Gmail验证现有系统中的帐户,使用电子邮件地址作为标识符,并在该电子邮件地址不存在时创建一个帐户?如果是这样,我认为您不需要使用new_with_session;您可以使用链接中描述的模型方法:

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
  data = access_token.extra.raw_info
  if user = User.where(:email => data.email).first
    user
  else # Create a user with a stub password. 
    User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
  end
end

你可以创建一个类似的self.find_for_google_oauth方法,并在Users::OmniauthCallbacksController中创建相应的google方法。
如果你想在创建用户时使用来自Facebook或Google回调的其他数据,只需将其添加到你的find_for_oauth方法中的User.create!行中,如下所示:
User.create!(:email => data.email, 
  :first_name => data.first_name, 
  :last_name => data.last_name, 
  :password => Devise.friendly_token[0,20])

这对我来说很好用,我不需要处理new_with_session。然而,我仍在学习Devise和OmniAuth,如果这种方法有什么问题,我很想听听您的意见。


我正在做同样的事情,它可以工作,但由于它是关于new_with_session编写的,所以我想知道是否有必要。 - Matteo Pagliazzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接