繁体   English   中英

Devise,Omniauth 和“新会话”

[英]Devise, Omniauth and 'new with session'

我的用户 model(使用 devise 和可确认的)根据 Omniauth + Devise(https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview )的要求称为new_with_session的方法:

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吗? 如果是这样,为什么?

new_with_session 用于 build_resource。 这与可注册(用户注册表)一起使用。

这仅在您的 Facebook/Omniauth session 已经存在并且您想使用 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

您是否希望通过 Facebook 或 Gmail 验证系统中的现有帐户,使用 email 地址作为标识符,并使用该 email 地址创建一个帐户(如果该地址尚不存在)? 如果是这样,我认为您不需要使用new_with_session 您可以使用您引用的链接中描述的 model 方法:

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

您可以在Users::OmniauthCallbacksController中创建类似的self.find_for_google_oauth方法和相应的 google 方法。

如果您想使用来自 Facebook 或 Google 回调的额外数据,在创建用户时,您只需将其添加到User.create! 在你的 find_for_oauth 方法中一行,像这样:

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,所以如果这种方法有问题,我很乐意听到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM