Как я могу иметь клиент AppSync / Apollo корневого уровня, когда пользователь не обязательно аутентифицирован? - PullRequest
0 голосов
/ 24 апреля 2018

Для фона я использую реагирование, редукс, реактивный маршрутизатор (v4), реактивный-когнито и appsync.Мое приложение использует PrivateRoute , чтобы гарантировать, что у пользователя есть авторизация для каждого запрошенного маршрута.act-cognito обрабатывает всю аутентификацию для меня и хранит токены JWT, временный ключ доступа IAM федеративной идентификации / секретный ключ доступа / токен сеанса в хранилище с избыточностью.

В учебнике AppSync предполагается, что вы используете AWS -усилитель вместо response-cognito, и размещает <ApolloProvider client = {this.client}> на уровне корневого приложения, где

this.client = new AWSAppSyncClient({
      url: AppSync.graphqlEndpoint,
      region: AppSync.region,
      auth: {

        // Amazon Cognito Federated Identities using AWS Amplify
        //credentials: () => Auth.currentCredentials(),

        // Amazon Cognito user pools using AWS Amplify
        // type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
        // jwtToken: async () => (await Auth.currentSession()).getIdToken().getJwtToken(),
      },
      disableOffline: true
    });
  }

В моем случае, на корневом компонентеmount В магазине пока нет ничего от реакции-cognito (половина моего SPA является общедоступной, не требующей аутентификации), и я не уверен, какую асинхронную функцию можно было бы вызвать при монтировании, чтобы получить эту информацию, когда она станет доступной, как это делается в примере выше.,

В настоящее время я решил эту проблему, поместив ApolloProvider на уровень компонентов, только для компонентов, которые в нем нуждаются и которые существуют в PrivateRoutes (следовательно, в хранилище будет доступна информация об учетных данных), но это приводит кдублирует код и чувствует себя не так.

Если не считать перехода на aws-усиление, есть предложения, как это изменить?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете продолжать использовать ApolloProvider на уровне корневого компонента. Конфигурация аутентификации будет считываться только при необходимости перед выполнением запроса к API AppSync.

Немного подробнее:

Объект под ключом auth в конфигурации, который вы передаете в конструктор AWSAppSyncClient, может содержать различные значения в зависимости от типа аутентификации, используемого вашим API.

  • apiKey для API_KEY
  • credentials для AWS_IAM
  • jwtToken для AMAZON_COGNITO_USER_POOLS

Эти три ключа могут содержать значения или функции, которые возвращают обещание , которое разрешается со значением. AWSAppSyncClient будет получать значение (или ожидать обещания) на каждый запрос .

Неважно, если во время создания экземпляра информация еще не находится в хранилище резервов. Я не проверял это (также я не знаком с response-cognito), но это было бы что-то вроде этого:

this.client = new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
        type: AUTH_TYPE.AWS_IAM,
        credentials: async () => {
            const state = store.getState();

            return state.cognito.creds;
        }
    },
    disableOffline: true
});
...