
之前的一个项目是 RESTful API (可能也不是很标准啦),用的 JWT 做认证。现在要加个会话管理的功能,可以查看登录的会话(包括登录方式,IP 等信息),可以吊销某个会话。
目前想按照这篇文章的方式实现(结合 session 和 jwt 的方式): https://clerk.com/blog/combining-the-benefits-of-session-tokens-and-jwts
请问各位大佬们,你们都是怎么实现的啊?
1 wu67 2024-10-28 20:56:24 +08:00 via Android redis 里面存黑名单,命中就要求重登? |
2 codehz 2024-10-28 20:58:00 +08:00 非要说的话,黑名单模式可以用布隆过滤器(定期重建并分发到每一个处理节点),有假阳性的时候才会去查数据库 |
3 sagaxu 2024-10-28 21:00:58 +08:00 加了集中式存储的 JWT ,那跟直接用 session 有啥区别 |
4 chobitssp 2024-10-28 21:01:32 +08:00 jwt 的颁发时间小于吊销时间就踢出 |
5 vZexc0m 2024-10-28 21:16:26 +08:00 和 JWT 的设计初衷背道而驰了。你这种直接用 cookie ,然后服务端管理 cookie 就行。 |
6 JUSTIGNOREME OP @wu67 不太好用 redis ,因为是 windows 系统 |
7 JUSTIGNOREME OP @sagaxu 我看那个文章里的是 jwt 用于请求,签发新 token 的时候用 session ,不过用啥不重要啦,主要是实现这个功能。 |
8 JUSTIGNOREME OP @vZexc0m 嗯嗯,没得办法,这个功能好像如果只用 JWT 的话不太好实现 |
9 paradox8599 2024-10-28 22:31:09 +08:00 via Android 那应该就不用 jwt 了,jwt 主打一个无状态 |
10 crysislinux 2024-10-28 22:45:44 +08:00 via Android 还是用传统 session 吧,jwt 干用户登录这个活儿是真的不太方便 |
11 shakaraka PRO 就 session 啊,jwt 玩的是无状态,把 jwt 玩成有状态的话那么和不就是重新发明 session ? |
12 hallDrawnel 2024-10-29 01:35:55 +08:00 直接用 session 或者不好改得话,做成 jwt 版本的 session 就 ok 。不用拘泥于标准。 |
13 vjnjc 2024-10-29 02:21:21 +08:00 via Android 正在做登录,一楼正解 |
14 chendy 2024-10-29 08:42:08 +08:00 对于客户端,传统 token 机制(包括 cookie 里放 sessionid )默秒全 jwt 还是留给服务内部互相调用使用吧 |
15 Spute 2024-10-29 09:23:58 +08:00 jwt 的主要优点就是无状态,对于服务端来说无需保存会话状态。如果有主动撤销 jwt 的需求,好像只能使用黑名单机制,这样一来又变成有状态了。 |
16 fffq 2024-10-29 11:24:13 +08:00 session 放 cookie ,那 cookie 禁用了咋办? |
17 StoneHuLu 2024-10-29 14:17:40 +08:00 你们说的 session 是存内存的 session 还是说内部实现是存 redis 的,如果是前者,需要横向扩展,有负载均衡的场景不就炸了吗,如果是后者,那不就是一般的 token 存 redis 的方式么 |
19 JUSTIGNOREME OP 不是面向 C 端的,所以基本不会有这种情况。 |
20 monkeyk 2024-10-30 19:07:25 +08:00 JWT 的 payload 中有一个字段叫 jti ,唯一的,是可以用来作为会话 ID 存的; 做会话管理的话,存 jti 就可以了;能用 redis 使用 TTL 属性过期自动释放,就能实现一套完整的会话管理。 但如何客户端只是浏览器的话,session 就够了。 |
21 fuxinya 2024-11-09 09:42:26 +08:00 access token 有效期设置短一点,过期后,拿着 refresh token 去换取 access token ,换取时,校验是否要被踢下线即可 |