Как использовать токен обновления JWT?

Я хочу реализовать JWT-аутентификацию для своих REST API. Клиент - это веб-приложение Reactjs, а серверная часть - это Expressjs REST API.

Предположим этот сценарий,

  1. Пользователь получает доступ / маршрут входа, сервер генерирует токен доступа и токен обновления и отправляет их клиенту. Где мне хранить токен доступа и токен обновления? Могу ли я также хранить токен обновления в своей БД вместе с конкретным идентификатором пользователя?
  2. Срок действия токена доступа истек. Как мне обновить его, не заставляя пользователя снова входить в систему с учетными данными?

Нужно ли клиенту знать о токене обновления? Когда он пытается получить доступ к маршруту с истекшим токеном доступа, сервер может просто проверить его и использовать токен обновления, связанный с идентификатором пользователя из БД, и сгенерировать новый токен доступа для клиента.


person Aritra Dattagupta    schedule 13.05.2020    source источник
comment
Для получения более точных ответов вам нужно указать гораздо больше о своем приложении, но в целом лучше всего хранить токены только в тех частях приложения, которые в них абсолютно необходимы. Если у вас есть серверная часть с отслеживанием состояния, которая может обрабатывать ваши транзакции jwt за вас, храните только свои токены и никогда не делитесь таким образом, чтобы клиентское приложение могло их прочитать. Я храню свои токены доступа только в памяти, если могу себе это позволить. Хранение токенов обновления в (заблокированной, возможно, зашифрованной) базе данных является обычной практикой.   -  person possum    schedule 13.05.2020


Ответы (1)


Ниже предполагается, что OAuth 2.0 / OpenId Connect.

  1. Лучшее место IMO для токенов доступа - в памяти. Токены обновления для собственных приложений должны надежно храниться на устройстве. Примечание: вам не следует хранить токены обновления в веб-клиентах / браузерах. Собственные приложения могут получить токен обновления, указав offline_access в списке областей, указанных в запросе к конечной точке /token.
  2. Для собственных приложений, получивших токен обновления, вы можете обнаружить 401 ответ на запросы к защищенным маршрутам и впоследствии попытаться получить новый токен доступа из токена обновления (который надежно хранится на устройстве). Чтобы получить новый токен доступа с помощью токена обновления, вы можете сделать еще один запрос к конечной точке /token, но на этот раз указав grant_type=refresh_token в дополнение к фактическому токену обновления, например. см. пример запроса ниже:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=refresh_token&client_id=4d7481b6-9de3-4e20-9fc1-f907cda9d993&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&refresh_token=QWERTY123&scope=openid%20offline_access" https://idp.example.com/token

Последняя вещь; если вы не можете жестко управлять доступом к своей базе данных, по соображениям безопасности вам, вероятно, не следует рассматривать сохранение токенов обновления в db.

person Ryan.Bartsch    schedule 13.05.2020