Привет всем. Этот блог будет продолжением моего предыдущего блога. Просмотрите мой предыдущий блог, чтобы понять, как проходит эта демонстрация.
В этом блоге я объясню, как создать представление API входа в систему с помощью Node js и JWT. Итак, приступим.
Содержание
- "Начальная настройка"
- Вход пользователя и генерация токена JWT
- Схема проверки
- Выполнение запроса с проверкой подлинности
1. Первоначальная настройка
В этом разделе я просто резюмирую то, что мы сделали в предыдущем блоге.
Изначально мы создали сервер и подключили его к базе данных MongoDB с экземпляром mongoose. Затем мы создали четыре папки с именем Models, Middleware, Controller, Routes.
.
index.js
const express = require('express') const bodyparser = require('body-parser'); const mongoose = require('mongoose') const router = require('./Routes/auth.route') var app = express() //Routes app.use(bodyparser.json()) app.get('/', function(req,res){ res.send('Hello world') }) app.use('/account/api',router) //MongoDb connection mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true}); mongoose.connection.once('open',function(){ console.log('Database connected Successfully'); }).on('error',function(err){ console.log('Error', err); }) //Server app.listen('8000',function(req,res){ console.log('Serve is up and running at the port 8000') })
После создания сервера мы создали файл маршрута с именем auth.route
для обработки всех запросов аутентификации.
Routes/auth.route.js
const router = require('express').Router() const signup = require('../Controller/auth.controller') const {validateUser} = require('../Middleware/validation'); router.post('/signup',validateUser,signup.signup) module.exports = router
Затем мы создали схему пользователя с атрибутами name, email, password.
Models/user.model.js
const mongoose = require('mongoose') const userSchema = new mongoose.Schema({ name: { type: String, required: true, max: 200, }, email: { type: String, required: true, unique: true, }, password: { type: String, required: true, min: 5 }, },{timestamps: true} ) module.exports = mongoose.model('User',userSchema)
После создания файла модели мы создали контроллер аутентификации и написали логику для регистрации.
Controller/auth.controller.js
const User = require('../Models/user.model') const bycrypt = require('bcryptjs') const jwt = require("jsonwebtoken"); async function signup(req,res,next) { const salt = await bycrypt.genSalt(10); hashpassword = await bycrypt.hash(req.body.password, salt) const emailExist = await User.findOne({email: req.body.email}) if(emailExist){ res.status(400).json({"error":'Email already Exist'}) } const user = new User({ name: req.body.name, email: req.body.email, password: hashpassword }) try{ const userSignup = await user.save() const payload = { user: { id: userSignup.id } }; jwt.sign(payload,"anystring",{expiresIn: 10000},function(err, token){ if(err){ res.send(err) } res.status(200).json({ token, userSignup }) }) } catch(err){ res.status(400).json({'error':err}) } } module.exports = { signup, login, }
Наконец, мы создали промежуточное ПО для проверки нашего запроса на регистрацию.
Middleware/validation.js
const {check, validationResult} = require('express-validator');exports.validateUser = [ check('name') .trim() .escape() .not() .isEmpty() .withMessage('User name can not be empty!') .bail() .isLength({min: 3}) .withMessage('Minimum 3 characters required!') .bail(), check('email') .trim() .normalizeEmail() .not() .isEmpty() .withMessage('Invalid email address!') .bail(), check('password') .not() .isEmpty() .withMessage('Password cannot be empty') .isLength({min: 6}) .withMessage('Password must be more that 6 charecters'), (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(422).json({errors: errors.array()}); next(); }, ];
Наш файл проекта выглядел так, как показано ниже.
2. Логин пользователя
Теперь приступим к созданию функции входа в систему. Для начала я создаю асинхронную функцию с именем login в файле auth.controller
. Внутри функции я просто проверяю, существует ли электронная почта, предоставленная пользователем. Если это так, я сравниваю пароль, предоставленный пользователем, с паролем, хранящимся в базе данных. Наконец, я генерирую токен JWT и отправляю его пользователю, как мы это делали в разделе регистрации.
Controller/auth.controller.js
//Login Controller async function login(req,res,next){ const emailExist = await User.findOne({email: req.body.email}) if(!emailExist){ res.status(400).json({error:"Email not Found"}) } const checkpassword = await bycrypt.compare(req.body.password, emailExist.password) if(!checkpassword){ res.status(400).json({error:"Password mismatch"}) } const token = jwt.sign({id: emailExist.id},'anystring') res.header('auth-token',token).json({'Token':token}) } module.exports = { signup, login, }
После выполнения всех этих действий просто вызовите контроллер входа в систему на маршрутизаторе аутентификации.
Routes/auth.route.js
const login = require('../Controller/auth.controller') router.post('/login',login.login)
Теперь перейдите по адресу http: // localhost: 8000 / account / api / login и сделайте почтовый запрос с учетными данными пользователя. Вы получите токен, с помощью которого вы сможете отправлять аутентифицированные запросы к серверу.
3. Проверка схемы
Теперь давайте создадим функцию проверки для проверки нашего запроса. Для этого я использую express-validator
.
Middleware/loginvalidation.js
const {check, validationResult} = require('express-validator'); exports.loginValidation = [ check('email') .trim() .normalizeEmail() .not() .isEmpty() .withMessage('Invalid email address!') .bail(), check('password') .not() .isEmpty() .withMessage('Password cannot be empty') .isLength({min: 6}) .withMessage('Password must be more that 6 charecters'), (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(422).json({errors: errors.array()}); next(); }, ];
Routes/auth.route.js
router.post('/login',loginValidation,login.login)
Теперь сделайте почтовый запрос к маршруту входа в систему с ошибкой полных данных. Промежуточное ПО проверки проверит вашу функцию и вернет ошибки, если обнаружит их.
4. Выполнение запроса с проверкой подлинности
До сих пор мы создали API для входа и регистрации в JWT. Теперь давайте защитим наш маршрут так, чтобы только зарегистрированные пользователи могли получить к нему доступ.
Для этого я создаю промежуточное ПО с именем auth.js
внутри папки Middleware
. Функция просто получает токен аутентификации от клиента и проверяет, действителен ли токен аутентификации. Если он действителен, это позволит пользователям получить доступ к маршруту. Если сейчас, он возвращает, что токен недействителен.
Middleware/auth.js
const jwt = require("jsonwebtoken"); module.exports = function(req, res, next) { const token = req.header("auth-token"); if (!token) return res.status(401).json({ message: "Authentication Failed" }); try { const val = jwt.verify(token, "anystring"); req.user = val; next(); } catch (e) { console.error(e); res.status(500).send({ message: "Token Invalid" }); } };
Интегрировать промежуточное ПО аутентификации в наш маршрут очень просто. Просто передайте промежуточное ПО маршрутизатору в качестве аргумента.
Routes/auth.route.js
const auth = require('../Middleware/auth') router.get('/user',auth, getCurrentUser.getCurrentUser)
Ниже я создаю контроллер, который возвращает сведения о пользователе. Эта функция будет работать, если предоставленный токен действителен, т.е. контроллер будет доступен только для зарегистрированных пользователей.
Controller/auth.controller.js
async function getCurrentUser(req,res){ try { const user = await User.findById(req.user._id); res.json(user); } catch (e) { res.send({ message: "Error in Fetching user" }); } } module.exports = { signup, login, getCurrentUser, }
Перейдите по адресу http: // localhost: 8000 / account / api / user и сделайте GET-запрос без токена. Этот запрос завершится ошибкой. Сделайте то же самое с токеном JWT, который вернет вам данные пользователя.
Не стесняйтесь обращаться ко мне по любым вопросам. Электронная почта: [email protected]. Linkedin: https://www.linkedin.com/in/sjlouji/
Полный код на моем GitHub:
Удачного кодирования!