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

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

  •  
  •   skai0dev · 23 天前 · 2572 次点击

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

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

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

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