我一直在尝试将JWT实施到我的应用程序中,这有点困惑。目前,我正在使用BCrypt来哈希和盐。我的文件在用户模型中看起来像这样
class User < ApplicationRecord
has_secure_password
validates :username, :email, :password_digest, presence: true
validates :password, length: { minimum: 6, allow_nil: true }
attr_reader :password
after_initialize :ensure_session_token
def self.find_by_credentials(email, password)
user = User.find_by(email: email)
user && user.is_password?(password) ? user : nil
end
def self.generate_session_token
SecureRandom.urlsafe_base64
end
def password=(password)
@password = password
self.password_digest = BCrypt::Password.create(password)
end
def is_password?(password)
BCrypt::Password.new(self.password_digest).is_password?(password)
end
def reset_session_token!
self.session_token = User.generate_session_token
self.save!
self.session_token
end
def ensure_session_token
self.session_token ||= User.generate_session_token
end
end
我想问的是,我是否需要创建一个新方法来进一步加密使用BCrypt的密码输出?就像我找不到用户使用BCrypt加密用户密码然后使用JWT的文章一样。我所看到的只是人们提到的通过向用户模型中添加has_secure_password来添加BCrypt,基本上是使用JWT创建哈希方法。
我的问题是用JWT替换BCrypt,或者关于同时使用JWT和BCrypt保护用户密码的一些建议?此外,任何初学者友好的文章,将不胜感激。
感谢您的帮助和解释。
答案 0 :(得分:0)
与登录用户并使用会话和cookie验证未来请求的方法相比,JWT是一种完全不同的方法。
如果您这样想,则用户进入您的应用程序并登录(例如,像普通的Devise一样)。您会在登录名上收到其用户名和密码,并在数据库中检查是否隐藏了BCrypt哈希。如果他们成功登录,则可以为他们提供JWT令牌。在该令牌内部编码了他们的用户ID。
当他们将来(通常是通过API)向您的应用程序发出请求时,他们将提供令牌而不是用户名密码。您的服务器有一个秘密,可以解密此令牌以检查它是否有效,然后可以使用内部的user_id知道它是正确的用户。这将使他们能够访问他们有权访问的任何资源。
JWT通常用于需要较长登录时间(而不是会话或cookie)的javascript前端或智能手机应用程序。令牌也是无状态的,只要服务器拥有秘密,它就可以检查其有效性并对其进行解密。
这是更详细的说明:https://github.com/dwyl/learn-json-web-tokens
以下是通过以下方式设置JWT的好指南:https://medium.com/@mazik.wyry/rails-5-api-jwt-setup-in-minutes-using-devise-71670fd4ed03