Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用json web令牌保护管理员页面_Node.js_Jwt - Fatal编程技术网

Node.js 使用json web令牌保护管理员页面

Node.js 使用json web令牌保护管理员页面,node.js,jwt,Node.js,Jwt,在我的节点后端,我有一个端点,服务器呈现一个管理页面。 身份验证是使用json web令牌完成的,因此我希望使用jwt保护对该页面(“/admin”)的访问,并确保只有admin可以访问该页面 问题是,当我获取此页面时,无法在授权标题中传输jwt(例如,如果我在url栏中键入www.mydomain.com/admin) 我想问的是,我该如何保护对该页面的访问 注:我将passport与本地策略和express jwt 以下是端点的代码: // routes // login is handle

在我的节点后端,我有一个端点,服务器呈现一个管理页面。 身份验证是使用json web令牌完成的,因此我希望使用jwt保护对该页面(“/admin”)的访问,并确保只有admin可以访问该页面

问题是,当我获取此页面时,无法在授权标题中传输jwt(例如,如果我在url栏中键入
www.mydomain.com/admin

我想问的是,我该如何保护对该页面的访问

注:我将
passport
与本地策略和
express jwt

以下是端点的代码:

// routes
// login is handled by auth subapp.
router.get('/', jwt, jwtAdmin, (req, res) => {
  Game.findAll({order: [['g_name', 'ASC']]}).then(games => {
    if (!games) {
      res.status(404).send({error: "No games..."});
      return;
    }
    res.status(200).render('sections/admin',
    Object.assign(viewOptions, {
      games
    }));
  }).catch(error => res.status(500).json({error}));
});
jwt中间件:

const jwt = require('express-jwt');
const blacklist = require('express-jwt-blacklist');

module.exports = jwt({secret: process.env.SECRET, isRevoked: blacklist.isRevoked});
module.exports = (req, res, next) => {
  if (!req.user) {
    res.status(401).send('you should login !');
    return;
  }

  if (!req.user.admin) {
    res.status(401).send('admin only !');
    return;
  }
  next();
}
jwtAdmin中间件:

const jwt = require('express-jwt');
const blacklist = require('express-jwt-blacklist');

module.exports = jwt({secret: process.env.SECRET, isRevoked: blacklist.isRevoked});
module.exports = (req, res, next) => {
  if (!req.user) {
    res.status(401).send('you should login !');
    return;
  }

  if (!req.user.admin) {
    res.status(401).send('admin only !');
    return;
  }
  next();
}

谢谢

答案是通过cookies传递令牌

有一个特殊的方法(getToken)来创建自定义逻辑来解码jwt。通过实现这一点,您可以说,若授权头中并没有jwt,那个么就从cookie中对其进行解码

module.exports = jwt({
  secret: JWT_SECRET,
  getToken: function readFromBearerOrCookies(req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
      return req.headers.authorization.split(' ')[1];
    } else if (req.cookies && req.cookies.jwt) {
      return req.cookies.jwt;
    }
    console.log('No token received...');
    return null;
  }
});