У меня есть API AWS AppSync, который использует роли IAM для аутентификации. Я использую клиент Amplify GraphQL для подключения к серверу AppSync. Изображение ниже описывает шаги, которые необходимо выполнить для получения учетных данных IAM, которые, как я предполагаю, способен выполнить Amplify. Тем не менее, я не могу найти документацию о том, как настроить рабочий пример.

Обратите внимание, что я использую пул пользователей Cognito напрямую для аутентификации, а не внешний провайдер, такой как Google или Facebook.

Access AWS Services with a User Pool and an Identity Pool

Пока что я могу аутентифицировать пользователя и получить токен JWT (шаг 1):

const Amplify = require('aws-amplify').default
const { Auth } = require('aws-amplify')


Amplify.configure({
  Auth: {
    region: process.env.AWS_REGION,
    userPoolId: process.env.COGNITO_USERPOOL_ID,
    userPoolWebClientId: process.env.COGNITO_WEBCLIENT_ID,
  },
})

Auth.signin(username, password)
  .then((user) => {
    const token = user.idToken.jwtToken
    // I've got the token - what next?
  })

Как я могу запросить учетные данные IAM из пула идентификаторов (шаг 2) и использовать их для доступа к API AppSync (шаг 3) с помощью Amplify?

Если Amplify не может получить учетные данные самостоятельно, я могу использовать AWS.CognitoIdentityCredentials для запроса их с помощью AWS SDK, однако я не вижу способа передачи их в Amplify для проверки подлинности запросов API (см. эту проблему я создал для получения более подробной информации).

3
Jonathan Holvey 17 Апр 2019 в 10:49

2 ответа

Лучший ответ

Если ваша конфигурация ampify имеет API-интерфейс AppSync с аутентификацией AWS_IAM и пулом Cognito, Amplify будет использовать токен id для автоматического получения учетных данных AWS.

Чтобы вызвать API-интерфейс AppSync, все, что вам нужно сделать, это:

API.graphql({query})
0
Ionut Trestian 17 Апр 2019 в 21:20

Я смог использовать cognito для аутентификации моего клиента, а затем передал jwtToken клиенту aws-appsync, чтобы иметь возможность использовать APPSYNC с AMAZON_COGINITO_USER_POOLS. Также в коде вы увидите, где я использовал API_KEY в качестве альтернативы. Я оставил API_KEY закомментированным. Я поделюсь этим как альтернатива для тех, кто также хочет попробовать получить доступ с помощью клиента Apollo и aws-appsync.

if (!process.browser) {
  global.fetch = require('node-fetch')
}

const appSyncClientOptions = {
  url: awsConfig.aws_appsync_graphqlEndpoint, 
  region: awsConfig.aws_appsync_region,
  auth: {
    // type: 'API_KEY',
    // apiKey: awsConfig.aws_appsync_apiKey,
    type: awsConfig.aws_appsync_authenticationType,   // 'AMAZON_COGNITO_USER_POOLS'
    jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken()
  },
  disableOffline: true,
};

const apolloClientOptions = {
  link: createAppSyncLink({
    ...appSyncClientOptions,
    resultsFetcherLink: createHttpLink({ uri: appSyncClientOptions.url, fetch })
  })  
};

const client = new Client(appSyncClientOptions, apolloClientOptions);

const WithProvider = () => (
  <ApolloProvider client={client}>
    <Rehydrated>
      <GqlList />
    </Rehydrated>
  </ApolloProvider>
)

export default WithProvider;
2
G Clark 26 Апр 2019 в 22:55