Этот пост в одной из частей моей серии о Создание реальных API с помощью NodeJS для начинающих.

Все основное содержание этой серии на случай, если мы хотим быстро ориентироваться:

Все эти коды в этом проекте можно найти здесь.

Обычно мы аутентифицируем наши 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, которую захотим.

Следующим шагом мы начнем писать модульные тесты для нашего приложения. Увидимся там.

Не стесняйтесь хлопать в ладоши, если вы считаете, что это стоит прочитать!

~ Удачного кодирования с мистером Лео ~