Использование стратегии паспорт-jwt.
Это пятая часть серии статей о ExpressJS.
Вы можете найти Часть 1 здесь. В нем рассказывается о создании базового экспресс-апи и настройке мокко для тестирования.
Вы можете найти Часть 2 здесь. В нем рассказывается о настройке PostgreSQL, продолжении для подключения экспресс-апи к базам данных.
Вы можете найти Часть 3 здесь. В нем говорится о создании ассоциаций (имеет множество, а также принадлежит) между двумя моделями.
Вы можете найти Часть 4 здесь. В нем говорится о настройке аутентификации пользователя на основе электронной почты и пароля.
Наш план атаки —
- Когда мы логинимся — создаем и отправляем JWT в ответ
- Когда мы попадаем на защищенный маршрут, JWT, отправленный как часть заголовка запроса, декодируется для извлечения информации о пользователе.
- Несанкционированный запрос без JWT отклоняется со статусом 401.
Сначала разберемся с первым пунктом —
Обновить тесты для входа
Поскольку мы ожидаем получить токен после входа в систему, мы должны обновить наши тесты, чтобы убедиться в этом.
Мы ожидаем, что response.body
будет объектом, содержащим токен, который мы можем использовать.
Создать и установить токен
Затем мы обновляем нашу стратегию passport-local
, чтобы создавать и отправлять через JWT всякий раз, когда пользователь входит в систему.
Сначала устанавливаем пакет веб-токенов JSON — npm i jsonwebtoken
Затем мы переходим к нашему auth/index.js
, где у нас есть логика обработки маршрута входа в систему.
Мы импортируем jsonwebtoken
вверху файла.
Теперь мы можем использовать jwt для «подписания» токена.
Мы будем использовать электронную почту пользователя в качестве полезной нагрузки JWT.
Полезная нагрузка — это информация, которую мы хотим сохранить в токене, и она доступна после того, как мы получим и декодируем токен для других запросов.
Это создает токен, используя доступный нам jwt.sign()
метод, и отправляет его в качестве ответа для действительной passport-local
аутентификации.
Вот так выглядит наш обновленный auth/index.js
—
Это именно то, что мы ищем в нашем тесте, и он должен стать для нас зеленым.
Время использовать этот токен и настроить защищенный маршрут.
Мы построим еще один маршрут до GET /user
endpoint и будем его защищать.
Напишите тест для маршрута пользователя
Мы знаем, что хотим защитить конечную точку GET /user
и вернуть статус 401
, если токен отсутствует в каком-либо запросе.
Сначала мы входим в систему и сохраняем токен, который получаем в ответ. Затем мы прикрепляем сохраненный токен в качестве заголовка Authorization
, чтобы получить действительный ответ.
Мы также проверяем, является ли ответ 401
, если токен отсутствует.
Мы можем обновить наши сиды, чтобы убедиться, что отправляются сообщения только для автора —
Итого мы создаем 8 постов и 2 авторов. С каждым из авторов связано 4 поста.
Мы также обновляем наш posts.spec.js
, чтобы проверить наличие 8 сообщений.
Настроить паспортную стратегию JWT
Установить пакет
npm i passport-jwt
Добавьте файл auth/passport-jwt.js
, где мы будем настраивать нашу логику
Мы определяем new Strategy()
, где мы берем выбор декодирования и секрет из вариантов. Мы извлекаем полезную нагрузку из входящего запроса JWT и находим пользователя с электронной почтой из полезной нагрузки.
Если пользователь найден, мы присоединяем его к объекту req
, после чего он доступен как req.user
.
Для справки, мы можем использовать разные методы для ExtractJwt
в зависимости от того, как клиент отправляет токен.
Создайте маршрут пользователя, импортируйте его и защитите паспортом
Теперь у нас настроена логика, пора построить маршрут и защитить его.
Сначала добавьте контроллерusers.js
—
Затем соедините его маршрутом routes/users.js
—
и импортируйте маршрут и используйте его в пределах app.js
Первый -
Потом -
Теперь маршрут подключен, и тесты станут зелеными!
Изучение JWT
Если мы перехватим JWT в полете, например. логирование/отладка консоли в user route test, мы получим что-то похожее на это —
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImF1dGhvckBtYWlsLmNvbSIsImlhdCI6MTU5MzQzNjcxMywiZXhwIjoxNTkzNDcyNzEzfQ.uTHjn39zcoSGWdFklAtWCsSOcJC2M-ORFMA
Мы можем посетить JWT.io и расшифровать токен, чтобы заглянуть внутрь —
Мы видим, что у токена есть полезная нагрузка, содержащая электронную почту и многое другое.
В следующей части серии мы рассмотрим отношения «многие ко многим» с использованием sequenceize.
Craft Academy – это поставщик технического образования, целью которого является привлечение новых талантов на рынок и помощь в решении проблемы нехватки технических специалистов. Мы исходим из убеждения, что современные стандарты разработки, гибкие методологии и бизнес-навыки имеют основополагающее значение для ИТ-специалистов.
Наша основная услуга — это 12-недельный учебный курс по программированию, призванный дать людям базовые навыки, которые позволят им войти в отрасль в качестве младших разработчиков.
Благодаря этой базе наши учащиеся находят работу в различных отраслях или открывают собственный бизнес, выводящий на рынок новые инновации.
Хотите узнать больше о том, чем мы занимаемся? Подпишитесь на нас здесь, в Medium, Facebook, Twitter или посетите наш веб-сайт.