@dovzzhenko

Почему я не могу прикрепить авторизацию к заголовку в apollo client?

Я пытаюсь связать регистрацию и авторизацию пользователя на фронтенде с моим сервером на Nest/Graphql.
Функционал создания и авторизации работает, я создаю пользователя и ставлю в куки access_token. Но проблема в том, что я не могу переходить по закрытым эндпоинтам, потому что apollo не дает прикрепить токен в заголовки запроса.

мое приложение на сервере (main.js):
async function bootstrap() {
  const app = await NestFactory.create(AppModule, { cors: true });
  app.useGlobalPipes(new ValidationPipe())
  app.useGlobalGuards(new JwtAuthGuard(new Reflector()))
  app.enableCors({
    origin: 'http://localhost:3000',
    credentials: true,
    allowedHeaders: 'Origin,X-Requested-With,Content-Type,Accept,Authorization,authorization'
  })

  await app.listen(3001);
}

bootstrap();


Модуль Graphql в AppModule:
GraphQLModule.forRoot({
      autoSchemaFile: join(process.cwd(), 'src/schema/gql'),
      sortSchema: true,
      driver: ApolloDriver
    })


И ApolloClient на фронтенде:
import { parseCookies } from 'nookies'
import { setContext } from '@apollo/client/link/context';
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'

const cookies = parseCookies()

const httpLink = createHttpLink({
    uri: 'http://localhost:3001/graphql'
});

const authLink = setContext((_, { headers }) => {
    const token = cookies.access_token
    return {
        headers: {
            ...headers,
            authorization: token ? `Bearer ${token}` : "",
        }
    }
});

export const client = new ApolloClient({
    cache: new InMemoryCache(),
    credentials: 'same-origin',
    link: authLink.concat(httpLink)
})


мой хедер реквеста:

62c96f884070d967589251.png
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Grapeoff
@Grapeoff
В чём концепция...?
Что там у вас с клиентом я не знаю, я не фронтендер, но:

1. Чтобы получить доступ к Request и Response в GraphQL, вы должны добавить эту строчку в конфигурацию GraphQLModule.

GraphQLModule.forRoot({
    autoSchemaFile: join(process.cwd(), 'src/schema/gql'),
    sortSchema: true,
    driver: ApolloDriver,
    context: ({ req, res }) => ({ req, res }), // <-----
})

2. CORS в GraphQL включается по-другому.

3. Я не уверен, что браузер отслеживает GraphQL запросы, так что есть большая вероятность что вы запечатлели на скриншоте какой-то из HTTP запросов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы