@graphql-yoga/plugin-jwt
Version:
jwt plugin for GraphQL Yoga.
86 lines (85 loc) • 2.73 kB
JavaScript
;
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());
}