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

JWT 密码失效当允许用户修改用户名

  •  
  •   wxd92 · 2020-08-28 20:17:13 +08:00 · 2322 次点击
    这是一个创建于 1547 天前的主题,其中的信息可能已经有所发展或是发生改变。

    JWT 生成的 token 的 payload 包含用户名信息;如果我们允许用户修改用户名,token 会立即失效,那我们是不是只能让用户重新登录然后获取新的 token? 有没有大佬有更好的方法?

    12 条回复    2020-08-28 23:47:52 +08:00
    optional
        1
    optional  
       2020-08-28 20:23:25 +08:00   ❤️ 1
    用户名会改那就 jwt 里放用户 id 啊,,难不成用户名是主键不成?
    a132811
        2
    a132811  
       2020-08-28 20:27:23 +08:00   ❤️ 1
    让 token 失效——只能让用户重新登录然后获取新的 token 。可以用 redis 做缓存,删除缓存 token 就失效

    让 token 不失效——就不要把用户名生成 token,可以用户的唯一 Id 作 token 呀。
    renmu123
        3
    renmu123  
       2020-08-28 20:31:24 +08:00 via Android   ❤️ 1
    修改用户名的时候返回一个更新过的 token
    iseki
        4
    iseki  
       2020-08-28 20:33:39 +08:00 via Android
    所以你们使用用户名作为用户的唯一标识而不是一个相对于用户透明的唯一 id 吗
    wxd92
        5
    wxd92  
    OP
       2020-08-28 20:39:41 +08:00
    @optional jwt 里也包含 user id, 除了这个还包含用户名
    wxd92
        6
    wxd92  
    OP
       2020-08-28 20:43:03 +08:00
    @a132811 让 token 不失效——就不要把用户名生成 token,可以用户的唯一 Id 作 token 呀。 ----如果还包含用户名呢?除了 id
    StevenTong
        7
    StevenTong  
       2020-08-28 20:43:24 +08:00   ❤️ 1
    2 楼已经说了两个常用的方案了。

    1. jwt token 使用 redis token store 之类的管理起来,修改 username 之后 revoke 当前 token 。但是这样就违背了 jwt token 的设计初衷了。
    2.username 不是用户名而是一个 user unique id,用户名自己通过 userinfo 去拉取。
    wxd92
        8
    wxd92  
    OP
       2020-08-28 20:49:34 +08:00
    @StevenTong 源码生成 payload 时,包含了 username

    def jwt_payload_handler(user):

    payload = {
    'user_id': user.pk,
    'username': username,
    'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
    }
    wxd92
        9
    wxd92  
    OP
       2020-08-28 20:51:16 +08:00
    @renmu123 后端触发 token refresh 是不是不好做?(不懂
    wxd92
        10
    wxd92  
    OP
       2020-08-28 20:55:38 +08:00
    @a132811 就不要把用户名生成 token ----这个如果不必须用户名的话,可行的。
    jakes
        11
    jakes  
       2020-08-28 23:47:21 +08:00   ❤️ 1
    token 不要放 username 啊,user id 已经可以表示用户了为什么非得把用户名这种会变更的放 token 里?放 Redis 里通过 user id 取不香吗?
    jakes
        12
    jakes  
       2020-08-28 23:47:52 +08:00
    不要想着非得在 payload 里放东西
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:13 · PVG 00:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.