5

我正在使用OmniAuthDevise对用户进行身份验证。我希望使用 OmniAuth 提供程序注册的用户能够设置可选密码(API 身份验证所需),但我遇到了困难。

如果用户通过 OmniAuth 创建帐户并尝试设置密码,则会收到以下错误:

BCrypt::Errors::InvalidHash in RegistrationsController#update

我相信这是因为密码是空白的。有什么好办法解决这个问题?我考虑过生成一个随机密码,但这种方法的问题是用户需要知道当前密码才能编辑设置。

编辑:我查看了允许用户在不需要当前密码的情况下更改设置,这就是我只想在用户最初没有密码的情况下做的事情。

4

4 回答 4

5

另一种方法是将以下内容添加到您的“用户”模型类中,以在没有要验证的密码时绕过密码验证,其中提供者是使用外部身份验证时设置的某个字段。

def valid_password?(password)  
  !provider.nil? || super(password)  
end
于 2011-03-10T22:01:48.023 回答
3

我假设您不想要简单的方法,即如果他们想设置密码,只需重置密码?

user.send_reset_password_instructions

于 2011-02-28T00:24:32.100 回答
1

这有点晚了,但它可能对其他人有所帮助,通过安德鲁的回答,您可以创建一个密码并将其存储在数据库中,但您无法使用您的电子邮件和新密码登录,通过设置解决了这个问题:

  def valid_password
    !provider.nil? && !encrypted_password.present? || super
  end
于 2013-01-16T02:53:00.240 回答
0

另一种选择。您不必包含新字段。只需捕获引发的异常并返回 false。这是代码。

def valid_password?(password)
   begin
      super(password)
   rescue BCrypt::Errors::InvalidHash
      return false
   end
end

这应该可以完成这项工作。

于 2011-05-19T13:28:17.783 回答