我有一个reactjs网站和asp.net核心后端,并且刷新令牌有问题。
当有人登录到我的网站时,他们将获得访问令牌和刷新令牌(相当标准)。现在,我设置了一个比访问令牌的时间短的计时器。
当他们有多个选项卡打开时,所有这些都很好用。问题在于它们都共享本地存储(需要自动登录,因此不能使用会话存储)
设想
2个标签页一个接一个地打开。在访问令牌死亡之前2分钟设置2个计时器。
第一次触发时会先发送刷新令牌到服务器,然后带回新的刷新/访问令牌。在服务器上,发送的刷新令牌将被删除。
第2个计时器会在第一个计时器后不久(第一个计时器正在工作时)触发,但现在很有可能已删除刷新令牌,从而使该请求无效。
如何停止这种比赛状态?
var foundRefreshToken = dbContext.Tokens.FirstOrDefault(x => x.Value == refreshToken);
if (foundRefreshToken == null)
{
return null;
}
var newRefreshToken = CreateRefreshToken(foundRefreshToken.ClientId, foundEmployee.Id);
dbContext.Tokens.Remove(foundRefreshToken);
dbContext.Tokens.Add(newRefreshToken);
dbContext.SaveChanges();
private Token CreateRefreshToken(string clientId, string userId)
{
return new Token()
{
ClientId = clientId,
EmployeeId = userId,
Value = GenerateRefreshToken(),
CreatedDate = DateTime.UtcNow
};
}
// high level js
refreshTimer;
setRefreshTimer(intervals) {
this.clearRefreshTimer();
this.refreshTimer = setInterval(() => {
this.refreshAuthentication();
}, intervals);
}
我能想到的仅有两件事是不要删除刷新令牌(但这会导致自动登录出现问题)
或者我在本地存储中有一个“锁定”第一个选项卡以执行刷新的标记,而其他标记则等待查看是否执行该操作(猜测需要另一个计时器)。如果不是,则尝试下一个。
还有其他想法吗?
素胚勾勒不出你
慕姐8265434
相关分类