Я пытаюсь собрать систему авторизации в node.js
, и все работает нормально с приведенным ниже кодом.
Authorize.js
const expressJwt = require('express-jwt');
const userService = require('../routes/users/user.service');
module.exports = authorize;
function authorize(roles = []) {
return expressJwt(
{
<<SOME SECRET>>,
isRevoked: (req, payload, done) => _isRevoked(req, payload, done, roles)
})
.unless(
{
path: [
]
});
}
async function _isRevoked(req, payload, done, roles) {
var user = await userService.getById(payload.sub);
var userRoles = payload.role;
// revoke token if user no longer exists
if (!user) {
console.log("Authorization: User not found")
return done(null, true);
}
//check if user is authorized
if (roles.length && !roles.every(elem => userRoles.indexOf(elem) > -1)) {
// user's role is not authorized
return done(null, true);
}
done()
};
RoleController.js
const express = require('express')
const router = express.Router()
const authorize = require('helpers/authorize')
router.post('/create', authorize('Admin'), createRole)
module.exports = router
function createRole(req, res, next)
{
//role creation code goes here
}
Пока все работает нормально, когда с токеном запрашивается маршрут create
, authorize.js
проверяет, является ли токен действительным, и после проверки, если пользовательРоль совпадает с ролью маршрута (например, admin
здесь)
Теперь проблема решается здесь
Я пытаюсь переместить authorize
в промежуточное ПО в RoleController.js
.И получите доступ для модуля из database
на основе запрошенного маршрута через req.originalUrl
var isAuthorized = function (req, res, next)
{
authorize(req.originalUrl) // just trying to check the authorization as a first level and moving forward to route only if authorized
next();
}
router.post('/create', createRole) //Removed authorize here
После изменения этого он не работает должным образом.Процесс переходит к функции authorize
, но он не вызывает функцию _isRevoked
.
Это может быть из-за async
в _isRevoked
, но я застрял здесь, чтобы продолжить.Есть идеи?