У меня есть SPA, который связывается с API, используя для аутентификации долгоживущий автономный JWT.
В настоящее время SPA хранит этот JWT в локальном хранилище.
Кроме этого Будучи довольно плохим с точки зрения безопасности, другая важная проблема заключается в том, что у меня есть способ отозвать доступ к API (который, между прочим, должен оставаться без состояния). У одного пользователя есть токен, он может использовать его неограниченное время.
Я бы хотел начать использовать refre sh токены. Я знаю, что они обычно не рекомендуются для SPA, однако после прочтения Окончательного руководства по работе с JWT на клиентских приложениях Я считаю, что есть способ сделать это безопасно.
Что мне бы хотелось:
- Когда пользователь входит в систему (предоставление пароля), сервер отвечает ТОЛЬКО коротким сроком доступа access_token, но устанавливает HttpOnly cook ie с маркером refre sh.
- Клиент хранит access_token в памяти и использует его при выполнении запросов API.
- Когда access_token подходит к концу, я бы сделал запрос на сервер аутентификации для обновления sh токена. Поскольку сервер авторизации установил значение ie, оно будет автоматически включено в запрос. Сервер отвечает обновленным маркером access_token, который мы храним в памяти.
- Если пользователь отходит от SPA и возвращается позже, мы можем просто сделать запрос серверу аутентификации для обновления sh токена, который дает нам совершенно новый (не нужно ничего хранить в локальном хранилище).
Это может показаться наиболее безопасным вариантом, сводящим к минимуму XRSF и CSRF:
- Если кому-то удастся внедрить некоторый код в SPA и украсть access_token, срок его действия все равно истечет через 5 минут. Внедренный код никогда не получает доступ к refresh_token.
- Вы не можете обмануть пользователя в выполнении запросов API CSRF, поскольку у вас нет access_token (токен доступа фактически служит токеном CSRF).
- Если кому-то все-таки удалось получить доступ к refresh_token, его можно отозвать на сервере аутентификации.
Если этот метод настолько же убедителен, насколько я думаю (докажите, что я неправ , пожалуйста!), почему это редко упоминается в Интернете?
Документы IdentityServer4, кажется, не покрывают это. Кто-нибудь может подсказать, как это можно реализовать? Я надеялся, что может быть свойство, которое я мог бы установить в конфигурации клиента в соответствии с UseCookiesForRefresh
, но нет.