我正在考虑从Devise 1.4.7迁移到Omniauth 1.0(使用“身份”策略或gem),我的问题是在完成所有代码转换,视图等之后,将旧密码,那些用户帐户使用Devise创建,仍然使用OmniAuth下的相同密码?
我做了一些研究,两人都在使用bcrypt,所以我猜“是”他们将像以前一样工作,用户不必创建新密码。或者我错过了一些关键的东西?
答案 0 :(得分:4)
设计密码不直接与omniauth-identity兼容
确实,他们都使用bcrypt来散列密码,但是Devise在密码中添加了“胡椒”。您必须将代码添加到omniauth-identity以支持“胡椒”。
Devise为你的密码添加了一个胡椒(因为它已经被bcrypt加盐),所以为了让你的设计用户迁移到omniauth-identity,你必须教会身份策略如何胡椒密码。这个snippit适用于我们,但是我们没有更改设计中的:stretches配置选项。
# snatch the pepper setting from the devise initializer
pepper = "biglonguglystringfromyourdeviseinitializer"
# password created by devise in your db (i.e. "my_password_123")
encrypted_password = "$2a$10$iU.Br8ZClxuqldJt8Evl5OaBbHPJeBWbGV/1RoUsaNIZMBo8wHYTq"
# pepper the password then compare it using BCrypt like identity does
BCrypt::Password.new(encrypted_password) == "my_password_123#{pepper}"
=> true
这是一个非常快速和肮脏的猴子补丁我们曾经使它工作。我们正在研究如何以更合适的方式添加此功能。
# file: ~/railsapp/config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :identity
end
module OmniAuth
module Identity
module SecurePassword
module InstanceMethodsOnActivation
# Returns self if the password is correct, otherwise false.
def authenticate(unencrypted_password)
pepper = "the big pepper string from the devise initializer"
if BCrypt::Password.new(password_digest) == "#{unencrypted_password}#{pepper}"
self
else
false
end
end
# Encrypts the password into the password_digest attribute.
def password=(unencrypted_password)
pepper = "the big pepper string from the devise initializer"
@password = unencrypted_password
unless unencrypted_password.empty?
self.password_digest = BCrypt::Password.create("#{unencrypted_password}#{pepper}")
end
end
end
end
end
end
答案 1 :(得分:0)
我不认为你遗漏任何至关重要的东西。两者都在使用bcrypt
。真棒。
但这有关系吗?我认为确实如此。
设计完成您的身份验证过程w.r.t到模型,即在这种情况下说users
。
现在您的旧用户已经注册并确认,所以这确实不是问题。 encrypted_password
和hashed_password
仍在用户表中供用户访问。
您需要担心什么?
=>您可能不得不担心authenticate_user!
过滤器。我猜是因为他们都使用bcrypt
身份验证并不是真正的问题。也许如果OmniAuth
不是,那么它们对用户进行身份验证的方式将完全不同,并且您的代码将会分崩离析。
这就是你唯一需要照顾的是我的感受。