Функция middleware не работает в node.js - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в JS. Я пытаюсь построить аутентификацию с токеном jwt.

У меня в системе 3 пользователя (роль: администратор, врач и пациент). Я передаю идентификатор пользователя и роль пользователя в полезной нагрузке для создания токена. Я передаю их как String.

У меня есть одно промежуточное ПО для аутентификации, которое является auth.js

Я пытаюсь написать другой, который ограничил бы доступ к маршруту (route / api / admin / me) только для администратора. то же самое в adminguard.js. (Я пытаюсь извлечь роль и проверить состояние)

Запросите помощь по второй функции промежуточного программного обеспечения или предложите лучшее решение.

routs / api / systemusers.js - (файл маршрута)

const express = require('express');
const router = express.Router();
const {check,validationResult}=require('express-validator/check');
const SystemUser = require('../../models/SystemUser')
const bcrypt=require('bcryptjs');
const jwt = require('jsonwebtoken');
const config =require('config');

// @ route  POST api/systemuser
// @ desc   Register user
// @ access Public
router.post('/',[
    check('username','please enter username').not().isEmpty(),
    check('role','please enter role').not().isEmpty(),
    check('password','please enter 6 or more characters').isLength({min:6}).not()
],
async (req,res)=>{
    const errors=validationResult(req);
    if(!errors.isEmpty()){
        return res.status(400).json({errors: errors.array()});
    }
    const {username, role, password }=req.body;
    try {
        //check for duplicate username request
        let user = await SystemUser.findOne({ username });

        if (user) {
          return res
            .status(400)
            .json({ errors: [{ msg: 'User already exists' }] });
        }
        systemuser = new SystemUser({
            username,
            role,
            password
          });
          //bcrypt pass word
          const salt = await bcrypt.genSalt(10);

          systemuser.password=await bcrypt.hash(password, salt);

          await systemuser.save();

          //return Jsonwebtoken
          const payload = {
            systemuser: {
              id: systemuser.id,
              role:systemuser.role
            }
          };

          jwt.sign(
            payload,
            config.get('jwtSecret'),
             (err, token) => {
              if (err) throw err;
              res.json({ token });
            }
          );
    } catch (err) {
        console.error(err.message);
        res.status(500).send('Server error');
    }

    });

module.exports=router;

auth.js (промежуточное ПО)

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = function(req, res, next) {
  // Get token from header
  const token = req.header('x-auth-token');

  // Check if not token
  if (!token) {
    return res.status(401).json({ msg: 'No token, authorization denied' });
  }

  // Verify token
  try {
    const decoded = jwt.verify(token, config.get('jwtSecret'));

    req.user = decoded.user;
    next();
  } catch (err) {
    res.status(401).json({ msg: 'Token is not valid' });
  }
};

adminguard.js (промежуточное ПО)

module.exports = function (req, res, next) {
    if(req.user && req.user.role !='admin') {
      next(new Error('You are not an admin'));
    } else {
      console.log();
      next();
    }
}

server.js (основной файл)

const express =require("express");
const connectDB = require('./config/db');

const app=express();

//connect databse
connectDB();

//init middleware
app.use(express.json({ extended: false }));

app.get('/',(req,res)=>res.send('API running'));

//Define routes

app.use('/api/systemusers',require('./routes/api/systemusers'));
app.use('/api/auth',require('./routes/api/auth'));
app.use('/api/admin',require('./routes/api/admin'));


const PORT =process.env.PORT|5000;

app.listen(PORT, ()=>console.log(`Server started on PORT ${PORT}`));


модель / SystemUser

const mongoose= require('mongoose');
const SystemUserSchema=new mongoose.Schema({
    username:{
        type:String,
        required:true
    },
    role:{
        type:String,
        required:true
    },
    password:{
        type:String,
        required:true
    },
    date:{
        type:Date,
        default:Date.now
    }
});

module.exports=SystemUser=mongoose.model('systemuser',SystemUserSchema);

1 Ответ

0 голосов
/ 12 июня 2019

Я предлагаю вернуть HTTP 403, если пользователь не является администратором, а не использует next:

module.exports = function (req, res, next) {
    if(!req.user || req.user.role !='admin') {
      res.status(403).send('You are not an admin');
      return;
    } else {
      console.log('User is an admin');
      next();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...