对于背景,我正在使用 react、redux、react-router(v4)、react-cognito 和 appsync。我的应用程序使用PrivateRoute来确保用户对请求的每个路由都有授权。react-cognito 为我处理所有身份验证并将 JWT 令牌、联合身份临时 IAM 访问密钥/秘密访问密钥/会话令牌存储在 redux 存储中。
AppSync 教程假设您使用的是 AWS-amplify 而不是 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 是公开的,不需要身份验证),我不确定在安装时可以调用什么异步函数来拉取这个似乎可用在上面的例子中完成。
目前我已经通过将 ApolloProvider 放在组件级别解决了这个问题,只针对需要它并且存在于 PrivateRoutes 中的组件(因此在商店中会有可用的凭证信息),但这会导致代码重复并且感觉不对。
没有迁移到 aws-amplify,有什么建议可以重构它吗?