UNPKG

@graphql-yoga/plugin-jwt

Version:
86 lines (85 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractFromHeader = extractFromHeader; exports.extractFromCookie = extractFromCookie; exports.badRequestError = badRequestError; exports.unauthorizedError = unauthorizedError; exports.createInlineSigningKeyProvider = createInlineSigningKeyProvider; exports.createRemoteJwksSigningKeyProvider = createRemoteJwksSigningKeyProvider; const graphql_yoga_1 = require("graphql-yoga"); const jwks_rsa_1 = require("jwks-rsa"); function extractFromHeader(options) { return ({ request }) => { const header = request.headers.get(options.name); if (header == null) { return; } if (!options.prefix) { const parts = header.split(' ').map(s => s.trim()); if (parts.length === 1) { return { prefix: undefined, token: parts[0], }; } return { prefix: parts[0], token: parts[1], }; } const [prefix, token] = header.split(' ').map(s => s.trim()); if (prefix !== options.prefix) { throw badRequestError(`Invalid JWT authentication token prefix.`); } if (!token) { throw badRequestError(`Authentication header was set, but token is missing.`); } return { token, prefix, }; }; } function extractFromCookie(options) { return async ({ request }) => { const cookieStore = request.cookieStore; if (!cookieStore) { throw new Error('Cookie store is not available on request. Please make sure to configure the cookie plugin.'); } const cookie = await cookieStore.get(options.name); if (!cookie) { return undefined; } return { prefix: undefined, token: cookie.value, }; }; } function badRequestError(message, options) { return (0, graphql_yoga_1.createGraphQLError)(message, { extensions: { http: { status: 400, }, }, ...options, }); } function unauthorizedError(message, options) { return (0, graphql_yoga_1.createGraphQLError)(message, { extensions: { http: { status: 401, }, }, ...options, }); } function createInlineSigningKeyProvider(signingKey) { return () => signingKey; } function createRemoteJwksSigningKeyProvider(jwksClientOptions) { const client = new jwks_rsa_1.JwksClient(jwksClientOptions); return kid => client.getSigningKey(kid)?.then(r => r.getPublicKey()); }