我正在尝试使用
JSON Web令牌验证Node.js API.我可以生成令牌来验证用户.现在我需要根据用户角色来检测我的API.
以下是我如何路由中间件来验证和检查令牌.
以下是我如何路由中间件来验证和检查令牌.
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.这只能由管理员用户访问.现在我有另一个超级用户可以访问/ api / validate管理员用户无法访问的内容.我如何只为超级用户保护/ api / validate.我是否需要再编写一个中间件来执行此操作?
这是我现在如何进行管理检查,
apiRoutes.post('/delete/:id',requireAdmin,res) { //do the rest }; function requireAdmin(req,next) { var currentUserRole=".."; //get current user role if('admin' == currentUserRole ) { next(); } else{ next(new Error("Permission denied.")); return; } };
解决方法
创建JWT时,您可以将自己的有效负载作为私有声明提供.例如.:
{ "sub": "1234567890","name": "John Doe","admin": true,"superUser": false }
{ "sub": "1234567890","roles": [ "ADMIN","SUPERUSER" ] }
然后需要解码令牌(最好使用express.js中间件用于此身份验证/授权目的)并检查角色并在不允许时抛出HTTP 401.当它被允许时,调用next();继续进入匹配路线.
这种可能的中间件功能的一个小例子:
function canAccess(req,next) { checkAuthorization(req,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