2017-07-11 194 views
1

我想用JSON Web令牌验证Node.js API。我可以生成令牌认证用户。现在我需要根据用户角色来检测我的API。 这是我如何路由中间件来验证和检查令牌。基于角色的jwt授权

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 user访问。现在我有另一个super user谁可以访问/api/validate哪些admin user无法访问。如何仅为super user保护/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功能超级用户check.Is这个做管理员/超级用户检查的正确方法?

回答

2

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

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

相同的方式,也许可以列出一组用户角色的登录用户

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

需要什么然后令牌解码(最好使用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

0

添加requireAdmin功能,并检查是否通过解码有效载荷,角色是admin。

api.post('/create',requireAdmin, function (req, res) { 
    //..... 
} 

function requireAdmin(request, response, next) { 
    if (request.decoded.role != 'admin') { 
     response.json({message: 'Permission denied.' }); 
    } 
    else { 
     next(); 
    } 
};