чорнетка

про jwt

https://jwt.io/#debugger-io

одразу встановимо пакет

https://www.npmjs.com/package/jsonwebtoken

npm i jsonwebtoken

автентифікація - перевірка наявності користувача в бд

авторизація - перевірка на доступ до бд

З самого початку в індекс файлі підключимо роут, який відповідатиме за реєстрацію та залогінення

const authRoutes = require("./routes/authRoutes");
// code
app.use("/auth", authRoutes);

Пропишемо сам роут для реєстрації та залогінення: routes/authRoutes.js

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