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

2020-08-28 20:17:13 +08:00
 wxd92

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

2214 次点击
所在节点    信息安全
12 条回复
optional
2020-08-28 20:23:25 +08:00
用户名会改那就 jwt 里放用户 id 啊,,难不成用户名是主键不成?
a132811
2020-08-28 20:27:23 +08:00
让 token 失效——只能让用户重新登录然后获取新的 token 。可以用 redis 做缓存,删除缓存 token 就失效

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

1. jwt token 使用 redis token store 之类的管理起来,修改 username 之后 revoke 当前 token 。但是这样就违背了 jwt token 的设计初衷了。
2.username 不是用户名而是一个 user unique id,用户名自己通过 userinfo 去拉取。
wxd92
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
2020-08-28 20:51:16 +08:00
@renmu123 后端触发 token refresh 是不是不好做?(不懂
wxd92
2020-08-28 20:55:38 +08:00
@a132811 就不要把用户名生成 token ----这个如果不必须用户名的话,可行的。
jakes
2020-08-28 23:47:21 +08:00
token 不要放 username 啊,user id 已经可以表示用户了为什么非得把用户名这种会变更的放 token 里?放 Redis 里通过 user id 取不香吗?
jakes
2020-08-28 23:47:52 +08:00
不要想着非得在 payload 里放东西

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702294

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX