使用json web令牌保护管理页面

时间:2017-07-03 15:08:43

标签: node.js jwt

在我的节点后端,我有一个服务器渲染管理页面的端点。 使用json web令牌进行身份验证,因此我希望使用jwt保护对此页面(' / admin')的访问权限,并确保只有管理员才能访问此页面。

问题在于,当我收到此页面时,我无法在授权标头中传输jwt(例如,如果我在网址栏中输入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});

jwtAdmin中间件:

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

谢谢!

1 个答案:

答案 0 :(得分:0)

答案是通过cookie传递令牌。

express-jwt有一个特殊的方法(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;
  }
});