设计 - 将OAuth与现有帐户合并

时间:2014-06-06 11:00:43

标签: ruby-on-rails authentication devise omniauth

我使用他们网站https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

上的说明为Devise设置了omniauth

我现在希望允许已拥有帐户的用户使用他们的Google帐户透明地登录:如果Google帐户使用与之前注册的用户相同的电子邮件地址,则该网站应使用该帐户登录用户。< / p>

我只是在链接上修改了建议的代码,如下所示:

def self.from_omniauth(auth)
  user = User.find_by(email: auth.info.email)
  if user
    user.skip_confirmation! 
    user.provider = auth.provider
    user.uid = auth.uid
    user.name = auth.info.name
    return user
  end

  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.skip_confirmation! 
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name
  end
end

它似乎工作正常,但我想知道这段代码是否引入了我不知道的任何风险。对我来说,设计是一种黑盒子。

2 个答案:

答案 0 :(得分:7)

如果帐户都已确认,则您只能关联帐户。 Google是一家电子邮件提供商,因此电子邮件已经在他们的最终确认。但是,您不会检查您的用户帐户是否已确认。

因此,如果我知道您的电子邮件,我可以在您的网站上注册,并等待您稍后再登录Google。然后我就可以访问您的帐户了。

如果Devise's confirmed? method返回true,您应该只合并帐户。

答案 1 :(得分:1)

这是我现在使用的代码。快乐的复制粘贴。

def self.from_omniauth(auth)
  user = User.find_by(email: auth.info.email)
  if user and user.confirmed?
    user.provider = auth.provider
    user.uid = auth.uid
    return user
  end

  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.skip_confirmation! 
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name
  end
end