Где мне обновить свой JWT в SvelteKit

Я пытаюсь реализовать JWT-аутентификацию в приложении SvelteKit, и у меня возникают проблемы с тем, где в коде мне следует обновить свой доступ при перезагрузке сайта. В соответствии с тем, что я обнаружил, я должен хранить JWT в памяти, а затем иметь токен обновления, который хранится как файл cookie только для HTTP. Когда страница перезагружается или открывается в новой вкладке, мне нужно вызвать свой бэкэнд, чтобы узнать, действителен ли токен обновления, если это так, я сгенерирую новый JWT и верну его клиенту.

Где можно позвонить? Я думал, что getSession-крючок было бы хорошим местом, но я не могу использовать fetch оттуда.

1 ответ

Файлы cookie только для HTTP должны быть установлены через заголовок. В SvelteKit есть только несколько мест, где вы можете установить заголовки ответов:

getSession()вероятно, не лучший выбор. Основная цель этого хука - создать очищенную версию сервера. context для браузера (например, удаление конфиденциальной информации, такой как пароли / ключи API). Он вызывается после перехвата, поэтому было бы слишком поздно устанавливать какие-либо заголовки в ответе.

getContext()может быть лучшим выбором, потому что он вызывается перед перехватчиком. Таким образом, можно получить токен обновления и сохранить его в контексте до тех пор, пока он не будет отправлен в виде заголовка. Контекст доступен из handle() в виде request.context

Хотя это не очень хорошо задокументировано, fetchдоступен со всех этих крючков. Просто добавьте node-fetch как зависимость в package.json (не devDependency!).

Я думаю, что проблема с обновлением токена в хуках обновляется при каждом запросе. Это может добавить ненужные накладные расходы к вашему приложению.


Я думаю, что лучшее решение - обернуть любые вызовы API, для которых требуются токены JWT, в качестве конечных точек SvelteKit. Если вызов API завершился неудачно из-за устаревшего токена, конечная точка может получить новый токен и отправить его в браузер через Set-Cookieв заголовках ответов. Обратите внимание, чтобы это работало, вы должны убедиться, что конечная точка вызывается браузером (а не сервером). Шаблоны SvelteKit выполняются сначала на сервере, а затем снова в браузере. Если конечная точка вызывается с сервера, cookie браузера не устанавливается.

Другие вопросы по тегам