Этот пост в одной из частей моей серии о Создание реальных API с помощью NodeJS для начинающих.
Все основное содержание этой серии на случай, если мы хотим быстро ориентироваться:
- От анализа предметной области до разработки моделей баз данных.
- Настроить проект узла с нуля.
- Использование Sequelize и образа MySQL Docker для разработки.
- Организуйте структуру проекта.
- Аутентификация API с помощью паспорта.
- Написание модульного теста для API NodeJS с помощью Jest framework.
- Dockerize NodeJS application.
Все эти коды в этом проекте можно найти здесь.
Обычно мы аутентифицируем наши API для реального проекта. Это означает, что вам нужно включить токен в свой запрос к серверу, чтобы иметь возможность получить данные обратно.
Требовать пакеты
- паспорт: это основной пакет, который мы используем для аутентификации.
- Passport-local: пакет, реализующий локальную стратегию аутентификации. В нашем случае нам нужны только имя пользователя и пароль для простой аутентификации.
- Паспорт-jwt: промежуточное ПО для получения и проверки JWT.
- jsonwebtoken: помогает подписывать токены JWT.
Мы установим все эти пакеты в наш проект.
$ npm install --save jsonwebtoken passport passport-local passport-jwt
Определение стратегии Passport Local и Passport JWT
В корневой папке проекта мы создадим файл с именем passport.js
.
Сначала мы используем имя паспорта login
как LocalStrategy
(из пакета passport-local
). Мы обнаружим, что в одном модальном окне User есть одинаковые name
и password
.
Во-вторых, мы используем JWTStrategy (от паспорта-jwt) для синтаксического анализа токена, чтобы получить идентификатор пользователя. Мы найдем нашего пользователя в нашей базе данных на основе его идентификатора, чтобы проверить, существует он или нет.
Требовать запрос аутентификации в маршрутах
Затем мы применим наш механизм аутентификации для наших маршрутов. Нам нужно немного изменить routes/v1.js
:
const express = require('express'); const router = express.Router(); const passport = require('passport'); require('../passport'); ... /* eslint-disable */ router.post( '/login', AuthController.authenticate); router.get( '/users', passport.authenticate('jwt', { session: false }), UserController.getAll); router.post( '/users', passport.authenticate('jwt', { session: false }), UserController.create); ... /* eslint-enable */ module.exports = router;
Во-первых, нам нужно, чтобы все наши коды были из файла Passport.js в routes / v1.js.
Во-вторых, мы обновляем определение маршрутизатора для /GET
и /POST
/users
, чтобы он потребовал аутентифицированный токен, если вы хотите прикоснуться к этим API.
Наконец, вы можете видеть, что мы просто добавляем новый API /login
, который поможет нам войти в систему и получить токен для использования в нашем приложении.
Определить контроллер аутентификации
Мы будем использовать passport.authenticate
метод для обработки login
стратегии, которую мы определили в passport.js
выше. Обратите внимание, что пользователь - это то, что мы получили от passport.use('login', ...)
в passport.js
. На основе этой информации о пользователе мы будем использовать jsonwebtoken
, чтобы подписать новый токен и вернуться к нашему клиенту.
const token = jwt.sign({ user: body }, 'your_jwt_sescret');
Тестовая аутентификация с почтальоном
Мы войдем в систему через /v1/login
, чтобы получить токен.
Затем мы будем использовать этот токен в качестве токена на предъявителя и попытаемся получить информацию обо всех пользователях из /v1/users
API.
Теперь мы можем потребовать аутентификацию для любой конечной точки API, которую захотим.
Следующим шагом мы начнем писать модульные тесты для нашего приложения. Увидимся там.
Не стесняйтесь хлопать в ладоши, если вы считаете, что это стоит прочитать!
~ Удачного кодирования с мистером Лео ~