В качестве фона я использую react, redux, response-router (v4), react -ognito и appsync. В моем приложении используется PrivateRoute, чтобы пользователь имел авторизацию для каждого запрошенного маршрута. response -ognito обрабатывает всю аутентификацию за меня и сохраняет токены JWT, временный ключ доступа IAM / секретный ключ доступа / токен сеанса в хранилище redux.
В руководстве по AppSync предполагается, что вы используете AWS-ampify вместо react-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
});
}
В моем случае при монтировании корневого компонента в магазине пока нет ничего из react-cognito (половина моего SPA является общедоступной, не требующей аутентификации), и я не уверен, какая функция async может быть вызвана при монтировании, чтобы вытащить ее, когда она станет доступной, как кажется это необходимо сделать в приведенном выше примере.
На данный момент я решил эту проблему, разместив ApolloProvider на уровне компонентов, только для тех компонентов, которые в нем нуждаются и которые существуют в PrivateRoutes (следовательно, информация об учетных данных будет доступна в магазине), но это приводит к дублированию кода и кажется неправильным.
Если не считать перехода на aws-ampify, есть какие-нибудь предложения по его рефакторингу?