cor-base-service
Version:
Library build upon COR web services. Handles authN/authZ, standarizes logging and error messages
62 lines (61 loc) • 2.52 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTokenFromWebSocket = exports.verifyJWT = exports.getSigningKey = exports.getTokenFromHeader = void 0;
const jwt_decode_1 = __importDefault(require("jwt-decode"));
const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const errors_1 = require("../errors");
function getTokenFromHeader(req) {
let authHeader = req.get("Authorization");
if (Array.isArray(authHeader)) {
authHeader = authHeader[0];
}
return authHeader?.split("Bearer ").pop();
}
exports.getTokenFromHeader = getTokenFromHeader;
const getSigningKey = async (jwksUri, token, logger) => {
const idpClient = (0, jwks_rsa_1.default)({
jwksUri,
requestHeaders: {},
timeout: 30000
});
const decodedHeader = (0, jwt_decode_1.default)(token);
const kid = decodedHeader.kid;
const key = await idpClient.getSigningKey(kid).catch((error) => {
logger.error({ token, kid, idpClient, error }, "Error retrieving signing key");
throw (0, errors_1.InternalServerError)();
});
return key.getPublicKey();
};
exports.getSigningKey = getSigningKey;
const verifyJWT = async (jwksUri, token, logger) => {
const signingKey = await (0, exports.getSigningKey)(jwksUri, token, logger);
const payload = jsonwebtoken_1.default.verify(token, signingKey);
// TODO: Check the iss and other claims here!!!
return payload;
};
exports.verifyJWT = verifyJWT;
/**
*
* @param req The HTTP IncomingMessage object
* @param logger
* @returns
* @description Will look for a token in the Authorization header, and if not found, will look for a query parameter named accessToken
*/
const getTokenFromWebSocket = (req, logger) => {
let token = req.headers.authorization?.split("Bearer ").pop();
if (!token || token === "") {
logger.debug({ token }, "Token not found in header, looking for query parameters");
const location = new URL(req.url, `http://${req.headers.host}`);
const headerToken = location.searchParams.get("accessToken");
if (headerToken !== null) {
logger.debug("Token found in query parameter");
token = headerToken;
}
}
return token;
};
exports.getTokenFromWebSocket = getTokenFromWebSocket;