设计,Omniauth和'新会议'

时间:2012-04-04 16:51:22

标签: ruby-on-rails authentication devise omniauth

我的用户模型中有一个方法(使用设计和确认),根据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吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:9)

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

这仅在您的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

答案 1 :(得分: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,所以如果这种方法有问题,我很乐意听到它。