V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JUSTIGNOREME
V2EX  ›  Java

RESTful API / JWT 是不是没法做登录会话管理啊

  •  
  •   JUSTIGNOREME · 2024-10-28 20:52:02 +08:00 · 3577 次点击
    这是一个创建于 390 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前的一个项目是 RESTful API (可能也不是很标准啦),用的 JWT 做认证。现在要加个会话管理的功能,可以查看登录的会话(包括登录方式,IP 等信息),可以吊销某个会话。

    目前想按照这篇文章的方式实现(结合 session 和 jwt 的方式): https://clerk.com/blog/combining-the-benefits-of-session-tokens-and-jwts

    请问各位大佬们,你们都是怎么实现的啊?

    第 1 条附言  ·  2024-10-28 21:36:45 +08:00
    看了一些有这个功能的网站( GitHub ,Postman ),好像 cookie 里也没有 jwt
    第 2 条附言  ·  2024-10-29 09:27:20 +08:00
    感谢各位大佬,决定还是改成 session 认证吧
    21 条回复    2024-11-09 09:42:26 +08:00
    wu67
        1
    wu67  
       2024-10-28 20:56:24 +08:00 via Android
    redis 里面存黑名单,命中就要求重登?
    codehz
        2
    codehz  
       2024-10-28 20:58:00 +08:00
    非要说的话,黑名单模式可以用布隆过滤器(定期重建并分发到每一个处理节点),有假阳性的时候才会去查数据库
    sagaxu
        3
    sagaxu  
       2024-10-28 21:00:58 +08:00   ❤️ 3
    加了集中式存储的 JWT ,那跟直接用 session 有啥区别
    chobitssp
        4
    chobitssp  
       2024-10-28 21:01:32 +08:00
    jwt 的颁发时间小于吊销时间就踢出
    vZexc0m
        5
    vZexc0m  
       2024-10-28 21:16:26 +08:00
    和 JWT 的设计初衷背道而驰了。你这种直接用 cookie ,然后服务端管理 cookie 就行。
    JUSTIGNOREME
        6
    JUSTIGNOREME  
    OP
       2024-10-28 21:28:46 +08:00
    @wu67 不太好用 redis ,因为是 windows 系统
    JUSTIGNOREME
        7
    JUSTIGNOREME  
    OP
       2024-10-28 21:31:19 +08:00
    @sagaxu 我看那个文章里的是 jwt 用于请求,签发新 token 的时候用 session ,不过用啥不重要啦,主要是实现这个功能。
    JUSTIGNOREME
        8
    JUSTIGNOREME  
    OP
       2024-10-28 21:33:08 +08:00
    @vZexc0m 嗯嗯,没得办法,这个功能好像如果只用 JWT 的话不太好实现
    paradox8599
        9
    paradox8599  
       2024-10-28 22:31:09 +08:00 via Android
    那应该就不用 jwt 了,jwt 主打一个无状态
    crysislinux
        10
    crysislinux  
       2024-10-28 22:45:44 +08:00 via Android
    还是用传统 session 吧,jwt 干用户登录这个活儿是真的不太方便
    shakaraka
        11
    shakaraka  
    PRO
       2024-10-28 22:54:46 +08:00
    就 session 啊,jwt 玩的是无状态,把 jwt 玩成有状态的话那么和不就是重新发明 session ?
    hallDrawnel
        12
    hallDrawnel  
       2024-10-29 01:35:55 +08:00
    直接用 session
    或者不好改得话,做成 jwt 版本的 session 就 ok 。不用拘泥于标准。
    vjnjc
        13
    vjnjc  
       2024-10-29 02:21:21 +08:00 via Android
    正在做登录,一楼正解
    chendy
        14
    chendy  
       2024-10-29 08:42:08 +08:00
    对于客户端,传统 token 机制(包括 cookie 里放 sessionid )默秒全
    jwt 还是留给服务内部互相调用使用吧
    Spute
        15
    Spute  
       2024-10-29 09:23:58 +08:00
    jwt 的主要优点就是无状态,对于服务端来说无需保存会话状态。如果有主动撤销 jwt 的需求,好像只能使用黑名单机制,这样一来又变成有状态了。
    fffq
        16
    fffq  
       2024-10-29 11:24:13 +08:00
    session 放 cookie ,那 cookie 禁用了咋办?
    StoneHuLu
        17
    StoneHuLu  
       2024-10-29 14:17:40 +08:00
    你们说的 session 是存内存的 session 还是说内部实现是存 redis 的,如果是前者,需要横向扩展,有负载均衡的场景不就炸了吗,如果是后者,那不就是一般的 token 存 redis 的方式么
    lvajax
        18
    lvajax  
       2024-10-29 16:17:08 +08:00
    @chobitssp 我就是这样做的
    JUSTIGNOREME
        19
    JUSTIGNOREME  
    OP
       2024-10-29 17:33:40 +08:00
    不是面向 C 端的,所以基本不会有这种情况。
    monkeyk
        20
    monkeyk  
       2024-10-30 19:07:25 +08:00
    JWT 的 payload 中有一个字段叫 jti ,唯一的,是可以用来作为会话 ID 存的;
    做会话管理的话,存 jti 就可以了;能用 redis 使用 TTL 属性过期自动释放,就能实现一套完整的会话管理。
    但如何客户端只是浏览器的话,session 就够了。
    fuxinya
        21
    fuxinya  
       2024-11-09 09:42:26 +08:00
    access token 有效期设置短一点,过期后,拿着 refresh token 去换取 access token ,换取时,校验是否要被踢下线即可
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2469 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:15 · PVG 14:15 · LAX 22:15 · JFK 01:15
    ♥ Do have faith in what you're doing.