Rails 怎么做 Token Authentication?

jeffhappily · 2017年10月03日 · 最后由 breeze 回复于 2017年10月07日 · 3133 次阅读

我最近开始学习 React Native,想要自己搭建一个小项目,后端是用 Rails API。因为是第一次做 API,所以也对 Token Authentication 不太熟悉。

我在网上也看了几个不同的教程,每个人做法都不太一样,有些人甚至把 Token 储存在数据库里,可是据我所知,后端是不该保存 Token 的。

所以我想请问各位,到底怎么样才是正确地方法?

hww 回复

devise-token-auth 的话呢?

后端不该保存 token ?我们一直保存在数据库,然后用的 Rails 内置的 http basic token auth 的方法

Token 要保存的,其实就是用它来做 key 来取用户信息。这种方式最好使用 https 连接。

用 JWT 的话不用保存 Token,甚至不用 https 也是安全的。

gingerhot 回复

JWT 作为传输的包,验证内容还是建议用 token,不然 JWT 无法失效。

另外我看很多 JWT 实现只有 JWS(sign)没有 JWE(encrypt),要注意是否符合自己的安全要求。


就算有 JWE,没有 HTTPS 一样会被劫持。

Rei 回复

就算有 JWE,没有 HTTPS 一样会被劫持。

做用户验证的话被劫持后的效果是一样的,所以还是需要 HTTPS 更安全。所以我的说法有误。

JWT 作为传输的包,验证内容还是建议用 token,不然 JWT 无法失效。

失效可以通过设置的失效时间来确定。如果只用 JWT 作为传输感觉就没有必要了,那还是使用普通的 Token + HTTPS 的机制就好了。

另外搜了下,感觉 JWT 还是一个饱受争议的技术: https://news.ycombinator.com/item?id=13865459

gingerhot 回复

如果服务器端持久化 Token,那 JWT 提供的种种机制就都没必要存在了,JWT 为了载荷的安全(不考虑劫持)还要搭配 JWE 使用,很多时候想清楚就发现是多此一举。

但是多站点做数据共享(或者说 SSO)的情况下,JWT 还是有用武之地的

gingerhot 回复

有时需要立即过期,例如发现账号被盗用了,失效时间就不够用了。

所以还是服务端持久化 Token 加 HTTPS 好。

Rei 回复

是否可以在 payload 加一个字段,放与密码相关的哈希,当用户重置密码后,之前的 token 就失效了。也不需要持久化 token。

zhandao 回复

我以前试过,可以是可以,后来要做个一键撤销 token 之类的功能要和密码解绑,就不用了。

Rei 回复

感觉账号被盗用后应该通过 “锁定账号” 的机制来提升安全。我们常用的银行或者其它系统都是这么处理的。

比如账号密码被盗了,只删除现有 Token,盗用者只要重新登录就可以了。

gingerhot 回复

如果不是服务端存 token,用户解除锁定了盗用者的 token 是不是又能用了?

锁定强制重制密码 + Token 立即失效。

Rei 回复

如果一定要提升安全的话,其实还是有可行的方法的。我现在能想到的比如也可以通过 “锁定并强制重置密码 + 一个过期周期内强制使用账号密码登录” 实现。

另外如果单纯从安全角度考虑,在数据库中存储 Token 如果被攻击者爆库的话,那造成的损失要比不存储的方式要大。 但是很显然,人们认为自己被爆库的可能性要低,所以大多数还是会选择存储 Token 的方案。

gingerhot 回复

如果被爆库,大部分攻击者要的信息已经拿到了,也可以随意篡改。所以敏感信息还要加密存储。

JWT 的大问题就是没有一个优雅的强制登出的解决方案

dudu_zzzz 回复

有超时方案

往 redis 里面加个 jwt 的黑名单。失效时间的设置与 jwt 的失效时间一致。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册