@graphql-yoga/plugin-jwt
Version:
jwt plugin for GraphQL Yoga.
78 lines (77 loc) • 2.31 kB
JavaScript
import { createGraphQLError } from 'graphql-yoga';
import { JwksClient } from 'jwks-rsa';
export 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,
};
};
}
export 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,
};
};
}
export function badRequestError(message, options) {
return createGraphQLError(message, {
extensions: {
http: {
status: 400,
},
},
...options,
});
}
export function unauthorizedError(message, options) {
return createGraphQLError(message, {
extensions: {
http: {
status: 401,
},
},
...options,
});
}
export function createInlineSigningKeyProvider(signingKey) {
return () => signingKey;
}
export function createRemoteJwksSigningKeyProvider(jwksClientOptions) {
const client = new JwksClient(jwksClientOptions);
return kid => client.getSigningKey(kid)?.then(r => r.getPublicKey());
}