Аутентификация клиента Apollo в AWS AppSync с помощью пользовательских пулов Cognito

Я пытаюсь подключиться к своему API AWS AppSync с помощью простого клиента Apollo, но не знаю, как правильно структурировать заголовок аутентификации.

До сих пор я следил за документацией по аутентификации заголовка здесь: https://www.apollographql.com/docs/react/recipes/authentication.html

И есть этот код, который я адаптировал для включения вызова токена в службу аутентификации Amplify, но он возвращает ошибку 401:

const httpLink = createHttpLink({
  uri: '[API end point address]/graphql'
});

const authLink = setContext((_, { headers }) => {
  const token = async () => (await Auth.currentSession()).getAccessToken().getJwtToken();
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : ""
    }
  }
})

const client = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
})

Единственная документация, которую я могу найти по этому поводу, не содержит никаких технических инструкций:

When using Amazon Cognito User Pools, you can create groups that users belong to. This information is encoded in a JWT token that your application sends to AWS AppSync in an authorization header when sending GraphQL operations.

Отсюда: https://docs.aws.amazon.com/appsync/latest/devguide/security.html

Я знаю, что этот токен в порядке, потому что, если я использую API JavaScript AppSync, он работает. Можно ли куда-нибудь узнать, как этого добиться, или кто-то знает, как это сделать?

Редактировать:

Пока я пытался изменить эту строку:

  authorization: token ? `Bearer ${token}` : ""

Следующие попытки:

token

jwtToken: token

authorization: token

Authorization: token

Ничего из этого тоже не сработало.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
3 914
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Отказ от ответственности: никогда не пробовал, но вот что я бы сделал:

Ознакомьтесь с кодом клиента AppSync здесь в качестве основы для создания ссылки аутентификации для клиента Apollo и сервера AppSync. Похоже, этот код предоставляет основу для каждого из доступных методов аутентификации.

В частности, если вы пытаетесь использовать метод аутентификации OPENID_CONNECT, это выглядит так, как будто токен JWT не нужно добавлять в начало Bearer (строка 156).

В этом есть смысл, но досадно, что для пулов пользователей Cognito это пусто. Вопрос редактирования, чтобы показать, что уже испробовано.

Exitialis 07.09.2018 19:48

Основываясь на том, что я прочитал из руководства разработчика AppSync, аутентификация пула пользователей Cognito должна использовать метод OPENID_CONNECT с использованием токена JWT, предоставленного службой пула пользователей Cognito.

Jclangst 07.09.2018 19:53

Кроме того, это указано в строке 144 размещенной мной ссылки.

Jclangst 07.09.2018 19:55

Формат Authorization: token должен быть ключом к его работе, поэтому я думаю, что проблема, скорее всего, связана с вашей конфигурацией пула пользователей Cognito или с самим токеном, а не с настройкой Apollo.

Jclangst 07.09.2018 20:01

Извините, вы правы, я видел эту строку, но не понял, что вы ничего в этом случае не означает, что он делает то, что делает следующий случай.

Exitialis 08.09.2018 21:47

Вы можете увидеть пример на Github из AWS sample. Работает с AppSync, но очень похоже.

// AppSync client instantiation
const client = new AWSAppSyncClient({
  url: GRAPHQL_API_ENDPOINT_URL,
  region: GRAPHQL_API_REGION,
  auth: {
    type: AUTH_TYPE,
    // Get the currently logged in users credential.
    jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken(),
  },
  // Amplify uses Amazon IAM to authorize calls to Amazon S3. This provides the relevant IAM credentials.
  complexObjectsCredentials: () => Auth.currentCredentials()
});

Ссылка на AWS репо

Другие вопросы по теме