Я пытаюсь подключиться к своему 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
Ничего из этого тоже не сработало.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Отказ от ответственности: никогда не пробовал, но вот что я бы сделал:
Ознакомьтесь с кодом клиента AppSync здесь в качестве основы для создания ссылки аутентификации для клиента Apollo и сервера AppSync. Похоже, этот код предоставляет основу для каждого из доступных методов аутентификации.
В частности, если вы пытаетесь использовать метод аутентификации OPENID_CONNECT, это выглядит так, как будто токен JWT не нужно добавлять в начало Bearer (строка 156).
Основываясь на том, что я прочитал из руководства разработчика AppSync, аутентификация пула пользователей Cognito должна использовать метод OPENID_CONNECT с использованием токена JWT, предоставленного службой пула пользователей Cognito.
Кроме того, это указано в строке 144 размещенной мной ссылки.
Формат Authorization: token должен быть ключом к его работе, поэтому я думаю, что проблема, скорее всего, связана с вашей конфигурацией пула пользователей Cognito или с самим токеном, а не с настройкой Apollo.
Извините, вы правы, я видел эту строку, но не понял, что вы ничего в этом случае не означает, что он делает то, что делает следующий случай.
Вы можете увидеть пример на 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 репо
В этом есть смысл, но досадно, что для пулов пользователей Cognito это пусто. Вопрос редактирования, чтобы показать, что уже испробовано.