我正在为rails json api使用基于令牌的身份验证。我已经在设计会话和注册控制器中重写了方法,因为devise弃用了token_authenticable模块。在这种状态下设计api是不必要的吗?对于像我这样编写令牌认证的目的,设计是否更安全?
例如,根据设计要点,我应该使用以下代码从令牌验证用户:
def authenticate_user_from_token!
email = params[:user_email].presence
user = email && User.find_by_email(email)
if user && Devise.secure_compare(user.authentication_token, params[:auth_token])
sign_in user, store: false
end
end
我相信params[:auth_token]
对于在标头中发送令牌的api不起作用。我也不确定在json api中sign_in user
的用途是什么。我可以保持设计并继续修改它以用于令牌或遵循例如https://github.com/danahartweg/authenticatable_rest_api/用于自定义解决方案。
答案 0 :(得分:1)
您的问题的答案取决于您想要多少安全性。使用存储在用户表中的身份验证令牌的安全性稍低,如用户名/密码。通过https连接,偶然攻击者很难获得他们需要的东西,但如果他们这样做,则很容易受到重放攻击。即使您实现滚动键(经常更改),也必须有某种方式将新密钥传递给客户端,同一攻击者可以拦截该密钥。也就是说,如果您想在标题中传递auth_token
,可以使用以下内容在控制器中检索它:request.headers[:auth_token]
。
HMAC是一种相当安全的方法,可以通过在客户端和服务器之间加入共享密钥以及签名请求的超时来防止重放攻击。有关HMAC和带有iPhone客户端的Rails服务器的更多信息,请参阅我对this question的回答。