Пропишемо сам роут для реєстрації та залогінення: routes/authRoutes.js
routes/authRoutes.js
const{Router}=require("express");// контроллери і мідлвариconstauthController=require("../controllers/authController");constauthMiddlewares=require("../middlewares/authMiddlewares");// можна одразу деструктуризувати// const { checkSignupUserData } = require("../middlewares/authMiddlewares");constrouter=Router();// signup - register new userrouter.post("/signup",authMiddlewares.checkSignupUserData,authController.signup);// login - login user - authentificationrouter.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
-----------
напишемо мідлваоку доступу по ролях (якщо у вкащаному масиві є роль яка збігається із роллю нашого користувача, то пропустить, якшо немає, то поверне далі еррорку)
після цього деякі роути можна закрити тільки для адміна і модератора.