对于背景,我正在使用React,Redux,React-Router(V4(,React-Cognito和Appsync。我的应用程序使用私有路线来确保用户对所请求的每条路线具有授权。React-Cognito为我处理所有身份验证,并存储JWT令牌,联合身份临时IAM访问密钥/秘密访问键/会话键/会话令牌。
appsync教程假设您使用的是AWS- amplify而不是React-Cognito,并且将<ApolloProvider client = {this.client}>
放置在root应用程序级别,其中
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
});
}
在我的情况下,在root组件安装处,商店中没有任何东西(我的水疗中心一半是公开需要身份验证的(,我不确定在MOUNT上可以打电话给什么async函数一次以拉动一次在上面的示例中似乎可以使用。
目前,我通过将Apolloprovider放在组件级别上解决了这一问题,仅适用于需要它的组件,并且存在于私有设备中的组件(因此,商店中会有凭证信息(,但这导致代码重复和代码重复和感觉错了。
何时迁移到AWS-amplify,任何建议如何重构?
您可以在根组件级别继续使用ApolloProvider
。验证配置仅在需要之前在需要时读取,然后再提出appsync api。
更多细节:
您传递给AWSAPPSAPPSYNCCLIENT构造函数中auth
键下的对象可以根据API使用的身份验证类型包含不同的值。
-
apiKey
forAPI_KEY
-
credentials
forAWS_IAM
-
jwtToken
forAMAZON_COGNITO_USER_POOLS
这三个键可以包含值或返回将从值解析的诺言的函数。Awsappsyncclient将在上获得值(或等待承诺(>。。
在实例化时,信息是否尚未在Redux商店中。我还没有测试过这个(我也不熟悉React-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
});