我正在开发一个新的rails api项目,我正在尝试获得最佳的可用性/安全性平衡。
用户将通过将用户名/密码发布到api/v1/sessions
来建立会话。对于有效用户,它将创建一个身份验证令牌,这是它自己的activerecord模型,由多态关系可验证关联,如果需要,可以灵活地拥有多个用户模型。
class AuthenticationToken < ActiveRecord::Base
before_create :digest_token
def self.from_authenticatable(authenticatable)
self.create(authenticatable: authenticatable, token: generate_token)
end
end
未消化的令牌(SecureRandom.hex)通过JSON呈现回客户端以验证未来的请求。使用BCrypt和配置的工作因子,令牌被加盐并消化以存储在数据库中。
客户端将提供原始身份验证令牌和身份(可以是用户名或密码)来加载用户记录。身份验证将由authenticate_with_http_token
def authenticate_token
authenticate_with_http_token do |token, options|
user = User.identified_by(options["identity"])
user.authentication_tokens.any? do |auth_token|
@current_user = user if auth_token.secure_compare(token)
end
end
end
Auth标记通过从设计中提升的恒定时间算法进行比较。
如果当前用户设置不成功,我会擅自渲染401。
我觉得这是相当安全的,我唯一想要做的就是在auth令牌中添加更多字段以跟踪它上次使用的位置(用户代理)以允许用户撤销某些身份验证他们喜欢的代币。
这种方法有什么重大漏洞吗?还有什么我应该考虑的吗?