要做实时登出的客户端 API,是不是完全不适合 JWT 鉴权?每个请求都要验证 token 有效性,传输和验证签名看起来是在浪费资源

2024-10-06 15:48:16 +08:00
 drymonfidelia
3167 次点击
所在节点    程序员
25 条回复
IvanLi127
2024-10-06 16:00:08 +08:00
我觉得只跑一个实例单体应用都不适合。其他情况或许有适合的用例。
要用 jwt 实现的话,做 token 黑名单查也能做出实时的效果。
renmu
2024-10-06 16:04:48 +08:00
不合适
crysislinux
2024-10-06 16:52:23 +08:00
登录还是 session 做吧。
CodeY99
2024-10-06 18:07:23 +08:00
感觉除非分布式要求非常高,无数台机子要分布式验证,真心不如 session
excxapp
2024-10-06 18:17:34 +08:00
JWT 有个办法,就是针对 token 增加时间戳,每次删除后,更新最新的时间戳,然后存到 redis 里面,比较时间戳之后的即可
zhenjiachen
2024-10-06 18:21:15 +08:00
@excxapp 这不就是 session 吗?这样有啥意义,用着 jwt 但是自己造了个 session ?
Belmode
2024-10-06 18:23:13 +08:00
想法很好,设计是可行的。不过有点需要注意,如果权限数据很多,不建议直接放到 jwt 里。
excxapp
2024-10-06 18:24:05 +08:00
@zhenjiachen jwt 的优势加个个性化需求了呗,楼主就是要登出,不然咋实现叻
dreamk
2024-10-06 20:54:43 +08:00
jwt 是无状态的,踢人不适合 jwt ,用黑名单反而复杂了
dreamk
2024-10-06 21:16:34 +08:00
grpc 可以用 basic auth 加盐的密码,放到 metadata ,类似于 http1 rest 请求的请求头
wxf666
2024-10-06 21:32:32 +08:00
@excxapp 如果每个请求,都要去 redis 判断一下,是否登出了,

为何不把 JWT 里的内容,挪到 redis 里,拿不到就是登出呢?

这样,每个网络请求能更小,带宽需求更低呀?
dreamk
2024-10-06 22:56:53 +08:00
@wxf666 jwt 就是存客户端的,还存服务器 redis 不多此一举吗。重启下服务集体登出?
wxf666
2024-10-06 23:05:29 +08:00
@dreamk #12

挪到,不是双重存储。。否则挪用公款,就是变出两份钱财的意思吗。。

redis 不是有 AOF 、RDB 机制吗?重启也不会丢数据呀。。
fox0001
2024-10-07 00:32:58 +08:00
@wxf666 #11 放到 redis 的话,就是 session 了
bluearc
2024-10-07 00:54:51 +08:00
可以,在下发 jwt 前先存储 tokenid ,用户登出后销毁 tokenid,不过这样事实上也就变成 session 了,如果 tokenid 过期时间长的话可以用黑名单,时间短的话还是仅记录每个用户最新的 tokenid
qsnow6
2024-10-07 01:07:32 +08:00
jwt 主要是用于资源鉴权使用的,登录状态的保留最佳实践就是 session 。我司 PHP 就是把 jwt 当 session 使用,导致服务器要踢用户下线时(改密码、修改权限)非常麻烦。
amlee
2024-10-07 01:19:29 +08:00
jwt 的设计理念就是无状态呀,你这“登出”的功能本身就是有状态的设计。
如果强行使用 jwt 来做登录、登出,那么必然后台要维护一个 jwt 的黑名单,这就又把状态引入回来了

直接用 session 就好了
iseki
2024-10-07 05:51:58 +08:00
即使这样我觉得用 JWT 也不是不行:
1. JWT 有标准化的规格说明,IETF RFC ;
2. 没必要为了节省传递 token 的那点流量把自己的路堵死,日后万一需要无状态降级也有机会;
vishun
2024-10-07 08:08:09 +08:00
jwt 压根不适合普通的用户登录,应用场景也非常有限,像是 ruoyi 系统这种用 jwt 作为普通 token ,只增加了解析复杂度和 token 长度这些缺点,换成随机字符串要好很多。
lairdnote
2024-10-07 08:25:24 +08:00
有 refresh 时间短点就搞定啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1077902

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX