Как обновить сеанс Cognito в асинхронной функции, которая должна возвращать действительные учетные данные - PullRequest
0 голосов
/ 08 мая 2018

У меня есть функция, которая запускается сразу после настройки хранилища Redux:

function configureApollo(store) {

  return new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {

    credentials: async () => {//...code that returns valid credentials}

    }
  })
}

Я использую реагирующее-когнито для управления учетными данными, и оно хранит их в хранилище избыточностей под store.getState().cognito.creds. Моя проблема заключается в том, что когда срок действия учетных данных истек и их необходимо обновить, реакция-cognito экспортирует функцию performLogin, которая возвращает обещание для действия "COGNITO_LOGIN", которое имеет полезную нагрузку с обновленными учетными данными.

Я чувствую, что должен отправить возвращенное действие и получить новые учетные данные из хранилища после его обновления, но отправка не имеет обратного вызова.

Я думаю, что могу читать учетные данные из действия COGNITO_LOGIN, отправлять действие и никогда не беспокоиться о считывании учетных данных из store.getState()

const resultAction = await performLogin(user, config, group);

store.dispatch(resultAction);
return new AWSCredentials(
  {
    accessKeyId: resultAction.creds.accessKeyId,
    secretAccessKey: resultAction.creds.secretAccessKey,
    sessionToken: resultAction.creds.sessionToken
  })

... но это кажется неправильным. Что если в редукторе произошла ошибка при сохранении учетных данных в хранилище? Тогда у моего AWSAppSyncClient есть учетные данные, которые не синхронизированы с остальной частью моего приложения.

Есть ли лучший подход здесь?

1 Ответ

0 голосов
/ 09 мая 2018

Если вы используете библиотеки aws-amplify, это намного проще. Взгляните на раздел об аутентификации в README.md по адресу https://github.com/aws/aws-amplify#2-add-authentication-to-your-app, чтобы использовать его для добавления аутентификации AWS Cognito в ваше приложение. После этого вы можете настроить учетные данные для AWS AppSync с помощью следующей команды

import { Auth } from 'aws-amplify';
import AWSAppSyncClient from 'aws-appsync';
import { AUTH_TYPE } from 'aws-appsync/lib/link/auth-link'
import AppSync from './AppSync.js';

const client = new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
        type: AUTH_TYPE.AWS_IAM,
        credentials: () => Auth.currentCredentials()
    },
    complexObjectsCredentials: () => Auth.currentCredentials(),
});
...