Node.js 使用json web令牌保护管理员页面
在我的节点后端,我有一个端点,服务器呈现一个管理页面。 身份验证是使用json web令牌完成的,因此我希望使用jwt保护对该页面(“/admin”)的访问,并确保只有admin可以访问该页面 问题是,当我获取此页面时,无法在授权标题中传输jwt(例如,如果我在url栏中键入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
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;
}
});