Rails 怎么做 Token Authentication?

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

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

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

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

hww #0 回复

devise-token-auth 的话呢?

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

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

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

gingerhot #3 回复

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

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


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

Rei #5 回复

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

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

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

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

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

gingerhot #7 回复

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

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

gingerhot #7 回复

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

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

Rei #9 回复

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

zhandao #10 回复

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

Rei #9 回复

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

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

gingerhot #12 回复

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

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

Rei #13 回复

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

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

gingerhot #14 回复

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

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

dudu_zzzz #16 回复

有超时方案

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

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