一切都好吗?我想知道最好的方法,以及是否可以将某个参数发送到NodeJS中的express函数。
我想使用我的路由传递字符串('admin')或其他我想运行'RoleTolen'的字符串。
功能verifyToken
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);
}
}
功能ValidToken
function validToken(req, res, next) {
jwt.verify(req.token, process.env.SECRET, (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
next();
}
});
}
功能RolesToken
function rolesToken(role, req, res, next) {
var decoded = jwt.decode(req.token);
if (!decoded.permissions.includes(role)) {
res.json("sem permissao");
} else {
next();
}
}
我的路线
router.post(
"/posts",
verifyToken,
validToken,
rolesToken("admin"),
customerController.posts
);
答案 0 :(得分:1)
function rolesToken(role, req, res, next)
不是一个正确的Express.js路由处理程序(因此,我想是一个问题)。
您可以做的是将rolesToken
编写为一个函数,该函数返回实际的Express.js兼容处理程序(函数):
function rolesToken(role) {
return function(req, res, next) {
var decoded = jwt.decode(req.token);
if (!decoded.permissions.includes(role)) {
res.json("sem permissao");
} else {
next();
}
};
}
答案 1 :(得分:0)
来自docs
以与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数外,特别是使用签名 $('#element-in-parent-frame', window.parent.document).get(0).scrollIntoView();
因此,您的RolesTaken函数将无法正常工作。
第二,您可以创建中间件或修改现有的中间件
(err, req, res, next)):
现在,您可以在控制器中间件的req.someProp中以(req, res, next) => {
//some stuff
if(req.path == '/posts') req.role= 'admin';
if(req.path == '/someOtherPath') req.role= 'someRole';
//some other stuff
}
的身份获得角色