Где мне обновить свой 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 браузера не устанавливается.