У меня есть сайт activjs и основной сервер asp.net, и у меня возникла проблема с токенами обновления.
Когда кто-то входит на мой сайт, ему выдают токен доступа и токен обновления (довольно стандартный).Теперь я установил таймер, который короче, чем время токена доступа.
Все это прекрасно работает, если у них открыто несколько вкладок.Проблема в том, что все они используют локальное хранилище (необходимо иметь autologin, поэтому нельзя использовать хранилище сеансов)
Сценарий
2 вкладки открываются одна за другой.2 таймера устанавливаются за 2 минуты до смерти токена доступа.
1-й раз запускает первую отправку токена обновления на сервер и возвращает новый токен обновления / доступа.На сервере отправленный токен обновления удаляется.
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);
}
Единственное, о чем я могу думать, это не удалять токен обновления (но это вызовет проблемы с автоматическим входом в систему)
Или у меня есть флаг в локальном хранилище, который «блокирует» 1-ю вкладку, чтобы выполнить обновление, а другие ждут, чтобы увидеть, делает ли это это или нет (угадайте, нужен другой таймер).Если нет, то попытается следующий.
У кого-нибудь еще есть идеи?