2017-07-11 231 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(); 
    } 
};