【问题标题】:Middle-ware function not working in node.js中间件功能在 node.js 中不起作用
【发布时间】:2019-10-27 09:17:23
【问题描述】:

我是 JS 的初学者。我正在尝试使用 jwt 令牌构建身份验证。

我在系统中有 3 个用户(角色:管理员、医生和患者)。我在有效负载中传递用户 ID 和用户角色以生成令牌。我将这些作为字符串传递。

我有一个用于身份验证的中间件,即 auth.js

我正在尝试编写另一个将路由 (routes/api/admin/me) 的访问权限仅限于管理员。在 adminguard.js 中也是如此。 (我正在尝试提取角色并检查条件)

请求有关第二个中间件功能的帮助或提出更好的解决方案。

routes/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}`));


模型/系统用户

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);

【问题讨论】:

  • 更重要的变化是拒绝所有非用户。这:req.user && req.user.role !='admin' 允许所有不是用户的人
  • @bambam :感谢您的帮助。能否详细解释一下,不确定我是否遵循您的建议。

标签: node.js jwt middleware


【解决方案1】:

如果用户不是管理员,我建议返回 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();
    }
}

【讨论】:

  • 您好,感谢您的帮助。我尝试了建议的解决方案,对于具有管理员角色的用户,我收到“您不是管理员”错误。请帮助。
  • 您能否在if 语句上方添加console.log(req.user) 并查看它的内容?也许admin 是大写的?
  • 您能否在auth.jsreq.user = decoded.user; 行上方添加console.log(decoded)
  • 嗨,马特,结果如下:{ systemuser: { id: '5d015bbb37854754f485d559', role: 'admin' }, iat: 1560370107, exp: 1560730107 } undefined
  • 好的,所以您需要通过decoded.systemuser 引用它,而不是auth.js 中的decoded.user。代码应为:req.user = decoded.systemuser;(因为user 未在decoded 变量中的任何位置定义)
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多