RESTful API / JWT 是不是没法做登录会话管理啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JUSTIGNOREME
V2EX    Java

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

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

    之前的一个项目是 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     3195 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:29 PVG 19:29 LAX 03:29 JFK 06:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86