@senacor/azure-function-middleware
Version:
Middleware for azure functions to handle authentication, authorization, error handling and logging
39 lines (38 loc) • 1.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const jwt_decode_1 = require("jwt-decode");
const error_1 = require("../error");
const evaluate = (rule, parameters, jwt) => {
const pathParameter = rule.parameterExtractor(parameters);
const jwtParameter = rule.jwtExtractor(jwt);
return pathParameter === jwtParameter;
};
exports.default = (rules, errorResponseBody, opts) => {
var _a;
const skipIfResultIsFaulty = (_a = opts === null || opts === void 0 ? void 0 : opts.skipIfResultIsFaulty) !== null && _a !== void 0 ? _a : true;
return (req, context, result) => {
if (skipIfResultIsFaulty && result.$failed) {
context.info('Skipping jwt-authorization because the result is faulty.');
return;
}
const authorizationHeader = req.headers.get('authorization');
const parameters = req.params;
if (authorizationHeader) {
const token = authorizationHeader.split(' ')[1];
if (token) {
const jwt = (0, jwt_decode_1.jwtDecode)(token);
const validationResult = rules
.map((ruleFunction) => evaluate(ruleFunction, parameters, jwt))
.reduce((previousValue, currentValue) => previousValue && currentValue);
if (!validationResult) {
throw new error_1.ApplicationError('Authorization error', 401, errorResponseBody !== null && errorResponseBody !== void 0 ? errorResponseBody : 'Unauthorized');
}
else {
context.extraInputs.set('jwt', jwt);
return;
}
}
}
throw new error_1.ApplicationError('Authorization error', 401, errorResponseBody !== null && errorResponseBody !== void 0 ? errorResponseBody : 'Unauthorized');
};
};