8

jwt 如何做在线踢人功能?

 7 months ago
source link: https://www.v2ex.com/t/980925
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Java

jwt 如何做在线踢人功能?

  SkyLine7 · 3 小时 54 分钟前 · 2500 次点击

不依赖第三方中间件(比如 redis )

36 条回复    2023-10-11 15:23:01 +08:00
bootvue

bootvue      3 小时 52 分钟前

必须依赖中心化的存储机制
Pythoner666666

Pythoner666666      3 小时 48 分钟前

不配合第三方中间件做不到
eastjoehan

eastjoehan      3 小时 47 分钟前

token 存在哪,那就在哪把 token 删掉
codehz

codehz      3 小时 47 分钟前

还是需要一个地方存 revocation list ()
相比于其他不透明 session 来说,revocation list 可以在后端用 bloom filter 做初筛(因为数量上 revoke 的肯定比较少,分发 bloom filter 的状态更便宜)
wu00

wu00      3 小时 45 分钟前

玩骚的是吧,一次性 token ,从签发处来控制
BBCCBB

BBCCBB      3 小时 42 分钟前

redis 记录这个 token 是否还能用. 白名单/黑名单都可以.
nikenidage1

nikenidage1      3 小时 42 分钟前

这就是 jwt 的缺点之一啊
thinkershare

thinkershare      3 小时 41 分钟前   ❤️ 2

Jwt 主要用来给资源授权的,生命周期很短。几乎不做权限回收控制。如果想要做有状态的会话凭证,又不想维护服务器状态,理论上就是矛盾的。
luckyrayyy

luckyrayyy      3 小时 40 分钟前

无状态怎么记录状态?开着车怎么走路?
cp19890714

cp19890714      3 小时 31 分钟前

办法:可以把 JWT 标签存储到服务端,用户访问时,校验当前状态是否有效,如果无效,就禁止访问。

另外,需要踢人,就不应该用 JWT 。JWT 滥用,V 站都说了很多次了。
sblid

sblid      3 小时 31 分钟前   ❤️ 3

既然需要状态就不要用 jwt ,否则自己重新实现了一个 session ,不是没事找事么。
nothingistrue

nothingistrue      3 小时 29 分钟前

做不了。JWT 只是个 Token ,不要只用它来做会话跟踪。在线踢人属于会话跟踪,必须上服务器端会话管理。
xiaogezz

xiaogezz      3 小时 22 分钟前

JWT 只做好认证的事情就好了,至于具体的访问权限,应该交由权限控制
ns09005264

ns09005264      3 小时 19 分钟前

我有个想法,那就是做和 session 相反的事,即:把要踢的用户保存在内存里。
具体是这样的:
用户改了密码或者要踢某个用户下线,就把该用户的 ID 保存到内存里,因为要踢下线的人一般都是少数,费不了多少空间。
当然要设置保存期限,和 JWT 的过期时间一样就行。
比如用户改了密码,就把他的 ID 保存到内存里,当他依然用旧令牌访问时,后端从旧令牌中解析到他的 ID 并与内存中的列表比对,如果存在就令牌失效,需要登录,同时删除列表里的 ID 。
如果他改了密码,但再也没有登录过刷新令牌,那么也无妨,因为内存中的列表过期也会清理的。
简单来讲,因为 JWT 对后端服务是无状态的,但可以在后端增加“踢人列表”这一点点不怎么占用资源的状态。
以上没有考虑分布式的情况,因为我没有分布式的经验。分布式的“登录与验证服务”应该也是单机的服务吧?
Breacher

Breacher      3 小时 14 分钟前 via iPhone

一直都是只把 JWT 当作 token 用,然后使用数据库跟踪它的状态:已退出、已 revoke 、重置密码后让旧 token 失效。我只是需要 JWT 的一些特性,比如能够携带一些键值对、能够验证签名(签名验证不通过直接返回未登录,避免将压力给到存储层)。
streamrx

streamrx      3 小时 12 分钟前 via iPhone

jwt 就是无状态
NX2023

NX2023      3 小时 11 分钟前

JWT 是没法撤销的,如果不依赖缓存,只能使用长短 JWT
在线踢人是不行的,只能说把短 JWT 设置的短一些,比如 1min 或者 30s

https://nickxu.me/post/jwt-refresh-token
fordoo

fordoo      3 小时 9 分钟前

提供一个思路,jwt payload 中保存一个用户的关键信息的签名,每次验证 jwt 的时候,同时去验证 db 里面用户的这个签名(可以加缓存减少 db 压力),需要踢 jwt 时,只需要让用户的关键信息变化就行
hyperbin

hyperbin      2 小时 58 分钟前 via Android

在用户表维护个 tokenStartTime ,鉴权时判断 jwt 的 iat 是否大于 tokenStartTime ,只要更新 tokenStartTime 到当前时间就可以拉黑以前签发的所有 token
NX2023

NX2023      2 小时 54 分钟前

@sblid 老哥,是这样的
XCFOX

XCFOX      2 小时 51 分钟前

@fordoo #18

jwt 的出现就是为了无状态、不访问 db 。既然业务需求不能无状态,不如直接把 jwt 的签名、验证这一套省略了。用最简单的最直观的 session 模式。
chendy

chendy      2 小时 32 分钟前

直接不用 jwt ,jwt 本身就适合在服务间传递,减少用户中心这类服务的压力
浏览器,客户端认证用普通的 token ( cookie 里的 sessionid 也算 token )
PVXLL

PVXLL      2 小时 32 分钟前 via iPhone   ❤️ 1

打电话给客户端使用者让他自己销毁
zsdroid

zsdroid      2 小时 31 分钟前

@ns09005264 负载均衡了解下
aladdinding

aladdinding      1 小时 58 分钟前

加一个黑名单的中间价
mdn

mdn      1 小时 42 分钟前

@fordoo 这样用户的其他端都会被踢掉,所有 token 失效,而不是单个
hongfs

hongfs      1 小时 39 分钟前

十月份才过去几天,第几个 JWT 帖子了。。。
manasheep

manasheep      1 小时 36 分钟前

token 时限设短,只有高危操作去验证用户账户状态,别的默认提供服务就可以了
hez2010

hez2010      1 小时 35 分钟前

其实最好的方法是不用 jwt
lidashuang

lidashuang      1 小时 34 分钟前

黑名单, 数据库存储黑名单
fire2y

fire2y      1 小时 33 分钟前

换个思路 把权限给禁掉就好了
cslive

cslive      49 分钟前

数据库总用的吧,数据库中拉黑
leegoo

leegoo      41 分钟前

因为 jwt 就是一个 token ,token 反解析出来可以获取到用户信息

数据结构类似于 : key:token ,value:info

我提供的思路是

在获取到 token 后,再使用另外一个 map 存储,这个 map 的 key 是 用户账号(保证用户的唯一性即可),value 对应这个 token
这样就能够保证 ,知道哪些用户登录了,如果要踢人, 只需要根据 新定义的那个 map 找到 对应的 token (可能有多个), 从 map 或者 redis 清理掉即可
chenduke

chenduke      31 分钟前

1.缩小 token 的过期时间,10 分钟,5 分钟。3 分钟, 看具体的场景的需要。
2.token 中包含生成的时间, 刷新 token 的时候与数据库中的最新刷新时间做比较,如果小于则返回需要重新登录。
3. 上面二条并不能保证及时性, 有条件加个消息推送的机制,这样就很及时了。
version

version      20 分钟前

@hongfs 生活压力大..最近太多人转行程序员了..只能找一些 10 年未维护的老旧项目接手(面试的人也不懂技术)...产品就会把遗留问题丢给新手..
fengpan567

fengpan567      18 分钟前

把用户禁了

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK