чорнетка
про jwt
одразу встановимо пакет
https://www.npmjs.com/package/jsonwebtoken
npm i jsonwebtokenавтентифікація - перевірка наявності користувача в бд
авторизація - перевірка на доступ до бд
З самого початку в індекс файлі підключимо роут, який відповідатиме за реєстрацію та залогінення
const authRoutes = require("./routes/authRoutes");
// code
app.use("/auth", authRoutes);Пропишемо сам роут для реєстрації та залогінення: routes/authRoutes.js
const { Router } = require("express");
// контроллери і мідлвари
const authController = require("../controllers/authController");
const authMiddlewares = require("../middlewares/authMiddlewares");
// можна одразу деструктуризувати
// const { checkSignupUserData } = require("../middlewares/authMiddlewares");
const router = Router();
// signup - register new user
router.post(
"/signup",
authMiddlewares.checkSignupUserData,
authController.signup
);
// login - login user - authentification
router.post("/login", authController.login);
module.exports = router;По суті ми прописали нові роути. signup - реєструє користувача (це для самого користувача з обмеженим функціоналом (без надання права встановлення ролі)), а login - автентифікує користувача.
Middleware checkSignupUserData у файлі middlewares/authMiddlewares.js - перевірятиме вхідні дані при реєстрації користувача, наявність користувача з таким email, якщо все ок, то пропускає далі
У коді вище signupUserDataValidator - це валідація даних за допомогою Joi у файлі utils/userValidator.js. Тут всі поля на відповідність вимогам. Але при цьому role юзера не перевіряємо, бо вона буде створюватися автоматично.
Тепер налаштовуємо контроллер controllers/authController.js
Тут ми використовуємо змінні JWT_SECRET і JWT_EXPIRES_IN, які ми зберігаємо у файлі .env і завантажуємо в оточення піл час запуску сервера. (одразу вписати копію в .example файл, але з пустими даними)
ВСЕ ВКАЗАНЕ ВИЩЕ ІТАК ПРАЦЮЄ, АЛЕ МОДНА ПРОВЕСТИ ДЕЯКИЙ РЕФАКТОРИНГ
Тут краще signToken винести в окремий файл і не тримати його в контролерах, а такод виносити в окремий файл все що повʼязано щ моделлю в даному випалку User
створимо папку services і в ньому файл jwtService.js і в неї винесемо функцію
І винесемо із контролерів обробку юзера (Це бажано робити у всіх мідлварках і контролерах)
Для Цього створимо services/userServices.js
І скоротимо контролер
Це повний цикл самостійної реєстрації користувача
-------------
Тепре напишемо залогінення користувача
Контроллер
цей код працює, аде уже можемо так само проветси рефакторинг коду як і з реєстрацією.
винесемо в services/userServices.js
А в контролерах лишимо оце
НА ЦЬОМУ ЕТАПІ УЖЕ Є АВТОРИЗАЦІЯ. тобто роути сайнап і логін відкриті для всіх.
Але треба провести автентифікацію, щоб звертатися по ендпойнтах для зміни в БД могли тільки авторизовані користувачі. для цього потрібно прописати мідлварку захисту тобто, щоб доступ до внесення змін в бд був тільки з токеном
Щоб в програмі Postman передавати токен потрібно вибрати autorization і bearer token
а в роутах де є доступ до бази даних для юзера треба вставити ту мідлварку перед всіма роутами
тобто в роутах буде проходити протект, а потім інші роути
На цьому етапі уже працює -------
Додамо ще один роут для авторизованиз користувачів
в контролерах напишемо юзер контролер якщо хочемо повертати залогіненого юзера по його jwt
-----------
напишемо мідлваоку доступу по ролях (якщо у вкащаному масиві є роль яка збігається із роллю нашого користувача, то пропустить, якшо немає, то поверне далі еррорку)
після цього деякі роути можна закрити тільки для адміна і модератора.
Після гет мі в роутах підключаємо
все працює, але можна порефакторити тохи
створимо в services/jwtService.js нову функцію
Last updated