Привет всем. Этот блог будет продолжением моего предыдущего блога. Просмотрите мой предыдущий блог, чтобы понять, как проходит эта демонстрация.



В этом блоге я объясню, как создать представление API входа в систему с помощью Node js и JWT. Итак, приступим.

Содержание

  1. "Начальная настройка"
  2. Вход пользователя и генерация токена JWT
  3. Схема проверки
  4. Выполнение запроса с проверкой подлинности

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, который вернет вам данные пользователя.

Посетите мой предыдущий блог, в котором я объяснил, как создать регистрацию пользователя с помощью Node js и JWT.

Не стесняйтесь обращаться ко мне по любым вопросам. Электронная почта: [email protected]. Linkedin: https://www.linkedin.com/in/sjlouji/

Полный код на моем GitHub:



Удачного кодирования!