高并发下,token过期怎么处理?
发布于 3 年前 作者 oyosc 3168 次浏览 来自 问答

react+koa+mongodb+redis 个人技术博客

现在遇到了一个问题,就当你在高并发或者不断刷新时,会提示token已经使用过一次,请重新登录。我这边的规则是token使用了一次就不能再继续使用,所以会出现多个请求带着相同的token来请求,这就导致后面的请求可能会出现token已经使用了一次而需要重新登录的问题,目前解决的方案是把请求里带的token头以key存到redis里,但是还是有可能会出现redis里没有这个token的key,想问下还有没有其他的解决办法呢?

10 回复

token只能使用一次很不科学吧, 怎么也得有个时效啊

@yinxin630 时效就是半小时,半小时以内使用了一次就重新生成个token,未使用过期了就需要重新登录

@oyosc 显然只能使用一次就刷新是很不科学的啊,这样你Redis不停就写入,压力也大。 不如试试一开始生成两个token,一个是Auth Token,一个是Refresh Token,设置Auth Token的时间为半小时,Refresh Token的时间长一点。当Auth Token过期时自动带上Refresh Token,生成新的Auth Token返回,如果生成新的Auth Token时发现刚刚已经生成了新的Auth Token,那就把刚刚生成的Auth Token直接返回。

@tinycold 这种更适合网页授权吧?想问下如果只能使用一次有没有其他更好的办法呢?

感觉这个问题可以忽略。如果实在要压测,可以先屏蔽token使用一次的检验。

暂时忽略token只能用一次合不合理,但更通用的理解应该是:“请求需要携带一次性凭证(这里是token),但由于客户端发起请求出现并行调用,出现一个请求成功,其他的请求失败”。

上述场景,出现多个请求中的一个成功而其他失败,这种现象是合理的,并不算BUG,但如果我们更希望另外一种行为:“第一个请求成功响应后,其他请求再响应成功或失败”,针对后者的一种应对方案:

维护凭证的使用状态(init, pending…),reqeust凭证是init状态则进入处理,pending状态则进入等待响应队列,request响应完成后,删除凭证并响应等待队列中的其他请求

等待队列中的请求响应成功还是失败看业务决定,同时也要考虑进入处理的request出错情况。

队列或加锁,如果是分布式,就用redis加锁.

你这个自相矛盾呀,又只能使用一次,又要同时并发。矛盾了。

感觉这个就是这样设计的效果呢

似乎你这个叫做nonce更合适。大家一般对于token的理解是一段时间内可重复使用的令牌。csrf token虽然单次使用 但对并发没要求。

回到顶部