UNPKG

apollo-flash

Version:

A smart and efficient toolkit to quickly bootstrap an apollo-server project.

79 lines (78 loc) 3.15 kB
"use strict"; 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;