【问题标题】:Implement jwt-permissions on NodeJS - UnauthorizedError在 NodeJS 上实现 jwt 权限 - UnauthorizedError
【发布时间】:2019-02-24 06:04:32
【问题描述】:

我是使用 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.eyJwZXJtaXNzaW9ucyI6WyJhZG1pbiJdLCJpYXQiOjE1Mzc0MDg0NzMsImV4cCI6MTUzNzQ0ODQ3M30.8l1vezWzKClnRU-Gmb5pKc3NzQ0ODQ3M30.8l1vezWzKClnRU

【问题讨论】:

  • 您的令牌中没有用户字段。 '{"permissions":["admin"],"iat":1537408473,"exp":1537448473}'
  • 我尝试该令牌,但我收到相同的错误:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7InBlcm1pc3Npb25zIjpbInVzZXIiLCJhZG1pbiJdfSwiaWF0IjoxNTM3NDA5MjY2LCJleHAiOjE1Mzc0NDkyNjZ9.fcwnIwm1Inup5M_d_N67230qfOulNBObinwx-z6LrtA 跨度>
  • 你的token应该使用split('.'),可以打印bearer[1],理论上应该是'eyJwZXJtaXNzaW9ucyI6WyJhZG1pbiJdLCJpYXQiOjE1Mzc0MDg0NzMsImV4cCI6MTUzNzQ0ODQ3M30',然后查看,解码步骤我没看到

标签: javascript node.js jwt token


【解决方案1】:

来自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 一起使用,或者您自己在您的 verifyToken 中间件中填充一个 req.user 对象(需要解码 JWT ),类似:

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

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

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

【讨论】:

  • 非常感谢,我确定我会在我的应用程序中实现 express-jwt 的使用。
  • @JairBolsonaro 玩得开心!
猜你喜欢
  • 2020-03-20
  • 2017-02-13
  • 1970-01-01
  • 2017-06-12
  • 2019-04-21
  • 2021-08-21
  • 2019-12-23
  • 2010-09-06
  • 2020-12-14
相关资源
最近更新 更多