在NodeJS上实现jwt-permissions-UnauthorizedError

时间:2018-09-20 01:55:01

标签: javascript node.js jwt token

我对使用Nodejs并不陌生,但是我承认我很喜欢,我正在使用令牌Jwt来对用户进行身份验证,这很简单,他们登录并赢得了令牌。但是我想在路由上设置权限,我一直在阅读有关express-jwt-permissions的信息,但是在我的应用程序中使用它时,POSTMAN出现了以下错误:UnauthorizedError:未找到用户对象“ user”。检查您的配置。

customerRoutes.js

const router = require('express').Router();

var jwt = require('jsonwebtoken');
var guard = require('express-jwt-permissions')()
const customerController = require('../controllers/customerController');




  function verifyToken(req, res, next) {
  // Get auth header value
  const bearerHeader = req.headers['authorization'];
  // Check if bearer is undefined
  if(typeof bearerHeader !== 'undefined') {
  // Split at the space
   const bearer = bearerHeader.split(' ');
   // Get token from array
   const bearerToken = bearer[1];
     // Set the token
    req.token = bearerToken;
    // Next middleware
   next();
   } else {
   // Forbidden
   res.sendStatus(403);
  }

  }

   router.post('/posts',verifyToken,guard.check('admin'),
   customerController.posts);

   module.exports = router;

这是我的令牌的外观:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwZXJtaXNzaW9ucyI6WyJhZG1pbiJdLCJpYXQiOjE1Mzc0MDgZNZMZ3K2Z1Z3Z3Z2Z3Z3K3Y3C3C3D3C3C3D3C3C3C3D0C0

1 个答案:

答案 0 :(得分:0)

摘自express-jwt-permissions

的文档
  

此中间件假定您已经具有JWT身份验证中间件,例如express-jwt。

然后使用第一个示例查找express-jwt文档:

var jwt = require('express-jwt');

app.get('/protected',
  jwt({secret: 'shhhhhhared-secret'}),
  function(req, res) {
    if (!req.user.admin) return res.sendStatus(401);
    res.sendStatus(200);
  });

与您遇到的错误相关联,可以肯定地说express-jwt-permissions中间件期望一个对象值填充req.user字段(然后我实际上检查了它们的源代码https://github.com/MichielDeMey/express-jwt-permissions/blob/master/index.js#L11并证明是事实。

因此,我的建议是使用express-jwt来为您工作并已知可以与express-jwt-permissions一起使用,或者在req.user中间件中填充verifyToken对象自己(需要解码JWT),例如:

// decode JWT
// get decoded token.permissions
req.user = {
  permissions: token.permissions
};

在调用next()到下一个中​​间件之前。

请注意,您还可以调整express-jwt-permissions以期望与user不同的字段(但仍需要位于快速中间件生命周期的req名称空间中),以及与令牌有效载荷内的permissions字段不同的名称。有关详情,请参见https://www.npmjs.com/package/express-jwt-permissions#configuration。但无论哪种方式,最重要的是您需要先对令牌进行解码。