在我的节点后端,我有一个服务器渲染管理页面的端点。 使用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();
}
谢谢!
答案 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;
}
});