apollo-flash
Version:
A smart and efficient toolkit to quickly bootstrap an apollo-server project.
79 lines (78 loc) • 3.15 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
// @ts-ignore
const apollo_server_express_1 = require("apollo-server-express");
const jsonwebtoken_1 = require("jsonwebtoken");
const _ = require("lodash");
/**
* Class responsible to build application context.
*
* @export
* @class ContextBuilder
* @template AuthScopeEnum
* @template User
*/
class ContextBuilder {
/**
* Get authorization from a JWT token if given with the request.
*
* @param {string} authorizationHeader
* @param {UserModel} model
* @returns {Promise<AuthContext>}
*/
getAuthorization(req, getUserFromId, getScopeFromUser, jwtSigningKey, verifyOpts) {
return __awaiter(this, void 0, void 0, function* () {
const parts = _.get(req.headers, "authorization", "").split(" ");
const jwtCookie = _.get(req, "cookies.jwt", undefined);
let token;
// No token
if (parts.length !== 2 && !jwtCookie) {
return {
isAuthenticated: false,
scope: null,
user: null,
};
}
// Parse authentication method
if (jwtCookie) {
// Check cookie auth first
token = jwtCookie;
}
else {
// Otherwise fallback to Authorization header
const scheme = parts[0];
token = parts[1];
// Check protocol
if (!/^Bearer$/i.test(scheme)) {
throw new apollo_server_express_1.AuthenticationError("Bad authorization header");
}
}
// Check token validity
try {
const { sub } = (yield jsonwebtoken_1.verify(token, jwtSigningKey, verifyOpts));
// Retrieve user using user given function
const user = yield getUserFromId(sub);
if (!user) {
throw new apollo_server_express_1.AuthenticationError("Unable to resolve an user from getUserFromId config. Maybe not found ?");
}
return {
isAuthenticated: true,
scope: getScopeFromUser ? yield getScopeFromUser(user) : [],
user,
};
}
catch (e) {
throw new apollo_server_express_1.AuthenticationError(e.message);
}
});
}
}
exports.default = ContextBuilder;