Остановить гонку Условие обновления токена? - PullRequest
1 голос
/ 10 мая 2019

У меня есть сайт 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-ю вкладку, чтобы выполнить обновление, а другие ждут, чтобы увидеть, делает ли это это или нет (угадайте, нужен другой таймер).Если нет, то попытается следующий.

У кого-нибудь еще есть идеи?

1 Ответ

0 голосов
/ 10 мая 2019

Когда вы создаете токен и токены обновления, оба должны иметь дату истечения срока действия, например:

return new Token()
        {
            ClientId = clientId,
            EmployeeId = userId,
            Value = GenerateRefreshToken(),
            CreatedDate = DateTime.UtcNow,
            ExpirationDate = <you decide>
        };

При каждом запросе вы должны проверять, не истек ли срок действия вашего токена, сравнивая даты.Если срок его действия истек, вы можете сохранить аутентификацию пользователя.В конечном итоге вы даже не можете истечь токен обновления, поскольку он должен надежно храниться вашим приложением.

Идея токена обновления и токенов с коротким сроком действия заключается в том, что в случае взлома токена хакер скажет только 10минут, прежде чем ему понадобится refresh_token для генерации нового ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...