Как дать пользователю токен JWT после перенаправления провайдера OAuth?
Я реализую OAuth (используя rauth) и буду давать токены JWT (используя flask-jwt), внешний интерфейс javascript (Angular1). Я сделал это для классического приложения, основанного на cookie/ сессиях. Оно работает. Теперь я хочу сделать это с токенами JWT.
Если я правильно понимаю, пользователь перенаправляется к провайдеру (например, Google), входит в учетную запись, мой сервер и провайдер делают магию, затем провайдер перенаправляет пользователя обратно на мою страницу. Теперь я получил профиль пользователя, и на этом заканчивается часть OAuth. В обычном сеансе вы даете пользователю файлы cookie и все остальное для настройки сеанса, а затем перенаправляете его на домашнюю страницу.
Вот где я застрял. Есть ли хорошая практика, как дать пользователю токен JWT после того, как провайдер отправит его обратно? Передать его пользователю как cookie при перенаправлении на домашнюю страницу? Поместить это в шапку? Насколько я знаю, мне нужен JavaScript для сохранения токена в LocalStorage/SessionStorage.
3 ответа
В конце дня пользователь будет перенаправлен обратно в наше приложение, где теперь необходимо отобразить страницу. Единственный вариант, который я вижу, - вернуть JWT в виде файла cookie, потому что заголовки ответа недоступны в Javascript, и единственное другое место - это вставить его в DOM, что откроет его для CSRF-атак.
Когда браузер перенаправлен от поставщика OAuth, у него будет только код доступа, который можно обменять на токен доступа на стороне сервера. Но лучшие практики говорят, что вам нужно держать этот токен в секрете (не передавать его обратно в браузер).
Существует много споров о JWT в файлах cookie по сравнению с локальным / сессионным хранилищем, но в этом сценарии использования я не вижу другого выбора, кроме как использовать куки. Все сценарии использования, которые я видел, которые описывают использование хранилища в браузере, предполагают, что XHR-запрос делается для получения JWT. Но это не вариант в потоке OAuth, потому что весь браузер был только что перенаправлен обратно в наше приложение.
Я не вижу другого варианта (для варианта использования OAuth), кроме как сохранить JWT в файле cookie, который будет использоваться для будущих вызовов API. Но, может быть, я что-то упустил.
Перед передачей управления на аутентификацию Facebook вы можете инициировать сокет-соединение с вашим API. Тогда, вероятно, покажите статус загрузки в вашем приложении. тогда пусть Facebook сделает свое дело. когда это удается, он отправляет данные в ваш бэкэнд, вы выполняете его, и передаете JWT во внешний интерфейс, используя сокет, созданный ранее. Это кажется слишком большой работой и может привести к ошибкам, если вы не сделаете это правильно.
const jwt = require("jsonwebtoken");
module.exports = {
signToken: function (payload) {
return jwt.sign(payload, "secret");
},
};