¿Cómo pasamos los encabezados al servidor Apollo executeOperation en las pruebas?
Hay una mención sobre pasar un objeto de encabezados aquí
Estoy tratando de pasar un encabezado de autenticación con o sin un token JWT para probar el control de acceso.
const result = await server.executeOperation({ query: query, http: { headers: { authorization: "" } } }) // Type '{ authorization: string; }' is not assignable to type 'Headers'. // Object literal may only specify known properties, and 'authorization' does not exist in type 'Headers'.ts(2322) Esto da como resultado un error de tipo. Hay una clase de encabezados definida en los tipos de servidor Apollo en fetch.d.ts pero no puedo importar para crear una instancia.
Usando "apollo-server": "^2.25.2" . ¿Alguna sugerencia o enlace para que esto funcione?
Actualización: como solución, estoy descifrando y decodificando el JWT en el contexto del servidor y pasando un usuario autenticado allí. Entonces puedo simular todo el contexto y crear un nuevo servidor de prueba con el contexto simulado. Sería bueno poder usar encabezados para obtener más experiencia de producción, pero esto funciona por ahora.
import { mockDeep, mockReset } from 'jest-mock-extended' interface Context { prisma: PrismaClient user: () => User|null } export const context = mockDeep<Context>() export const testServer = new ApolloServer({ typeDefs, resolvers, context }); // ... context.user.mockReturnValue({ id: 1, name: "Foo", slug: "foo", }) const res = await testServer.executeOperation({ query: query })Para resolver esto, he creado un objeto de solicitud 'falso' con el token JWT ya descifrado que usé para inicializar mi objeto de autenticación de terceros (keycloak) y pasar al contexto de apolo. Necesito inicializar el objeto keycloak porque tengo directivas de esquema de autenticación que requieren que se inicialice el objeto keycloak.
const req = { kauth: { grant: { access_token: { isExpired: () => { return false; }, token: "abc", content: { email: "me@me.com", resource_access: { "my-api": { roles: ["admin"], }, }, }, }, }, }, }; server = new ApolloServer({ schema, resolvers, dataSources: () => ({ users, }), context: () => { return { kauth: new KeycloakContext({ req }) }; }, }); });Aún así, me gustaría una solución que sea más nativa de apolo y no una solución alternativa.