gpt4 book ai didi

node.js - 基于角色的jwt授权

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:00 27 4
gpt4 key购买 nike

我正在尝试使用 JSON Web token 对 Node.js API 进行身份验证。我可以生成 token 来验证用户。现在我需要根据用户角色保护我的 API。以下是我如何路由中间件来验证和检查 token 。

var app = express();

var apiRoutes = express.Router();
apiRoutes.use(function (req, res, next) {

var token = req.body.token || req.param('token') || req.headers['x-access-token'];

if (token) {
jwt.verify(token, app.get('superSecret'), function (err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
req.decoded = decoded;
next();
}
});

} else {
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});

apiRoutes.get('/check', function (req, res) {
//...
});

app.use('/api', apiRoutes);

这样,我就可以保护 API 说 /api/check。这只能由 admin 用户 访问。现在我有另一个 super user 可以访问 /api/validateadmin user 不能访问。如何仅为 super 用户 保护 /api/validate。我是否需要再编写一个中间件来执行此操作?

这是我现在进行管理检查的方式,

apiRoutes.post('/delete/:id',requireAdmin, function (req, res) {
//do the rest
};

function requireAdmin(req, res, next) {
var currentUserRole=".."; //get current user role
if('admin' == currentUserRole )
{
next();
}
else{
next(new Error("Permission denied."));
return;
}
};

类似地,requireSuperUser 功能用于 super 用户检查。这是进行管理员/ super 用户检查的正确方法吗?

最佳答案

创建 JWT 时,您可以提供自己的负载作为私有(private)声明。例如:

{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"superUser": false
}

用同样的方法,您也许可以为登录用户列出一组用户角色

{
"sub": "1234567890",
"name": "John Doe",
"roles": [
"ADMIN",
"SUPERUSER"
]
}

然后需要解码 token (最好使用 express.js 中间件来实现此身份验证/授权目的)并检查角色并在不允许时抛出 HTTP 401。当允许时,调用 next(); 继续并进入匹配的路由。

这种可能的中间件功能的小例子:

function canAccess(req, res, next) {
checkAuthorization(req, function (err, authorized) {
if (err || !authorized) {
res.send({message: 'Unauthorized', status: 401});
}

next();
});

function checkAuthorization(req, callback) {
// jwt decode and actual authentication admin/superuser matching goes here..
}
}

router.use(canAccess);

有关 JWT 声明的更多信息:https://jwt.io/introduction

更多关于expressjs中间件的信息:https://expressjs.com/en/guide/using-middleware.html

关于node.js - 基于角色的jwt授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45025613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com