Для фона я использую реагирование, редукс, реактивный маршрутизатор (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-усиление, есть предложения, как это изменить?