Javascript 如何使用Cognito标识池连接到AWS AppSync并放大
我有一个AWS AppSync API,它使用IAM角色进行身份验证。我正在使用Amplify GraphQL客户端连接到AppSync服务器。下图描述了获取IAM凭据所需的步骤,我假设Amplify能够执行这些步骤。但是,我找不到任何关于如何建立工作示例的文档 请注意,我直接使用Cognito用户池进行身份验证,而不是像Google或Facebook这样的外部提供商 到目前为止,我能够对用户进行身份验证并获得JWT令牌(步骤1): 如何从标识池请求IAM凭据(步骤2),并使用Amplify使用这些凭据访问AppSync API(步骤3)Javascript 如何使用Cognito标识池连接到AWS AppSync并放大,javascript,amazon-web-services,authentication,aws-appsync,aws-amplify,Javascript,Amazon Web Services,Authentication,Aws Appsync,Aws Amplify,我有一个AWS AppSync API,它使用IAM角色进行身份验证。我正在使用Amplify GraphQL客户端连接到AppSync服务器。下图描述了获取IAM凭据所需的步骤,我假设Amplify能够执行这些步骤。但是,我找不到任何关于如何建立工作示例的文档 请注意,我直接使用Cognito用户池进行身份验证,而不是像Google或Facebook这样的外部提供商 到目前为止,我能够对用户进行身份验证并获得JWT令牌(步骤1): 如何从标识池请求IAM凭据(步骤2),并使用Amplify使
如果Amplify本身无法获取凭据,我可以使用AWS.CognitoIdentityCredentials使用AWS SDK请求它们,但是,我看不到将它们传递给Amplify以验证API请求的方法(有关更多详细信息,请参阅).如果您的amplify配置具有带有AWS_IAM身份验证的AppSync API和cognito用户池,amplify将使用id令牌自动获取AWS凭据 要实际调用AppSync API,只需执行以下操作:
API.graphql({query})
我能够使用cognito对我的客户端进行身份验证,然后将jwtToken传递给aws appsync客户端,以便能够使用appsync与AMAZON\u COGINITO\u USER\u池。在代码中,您还将看到我在何处使用API_键作为替代。我把API_键注释掉了。对于那些也希望尝试使用Apollo客户端和aws appsync访问的用户,我将此作为一种替代方案与他们分享
if (!process.browser) {
global.fetch = require('node-fetch')
}
const appSyncClientOptions = {
url: awsConfig.aws_appsync_graphqlEndpoint,
region: awsConfig.aws_appsync_region,
auth: {
// type: 'API_KEY',
// apiKey: awsConfig.aws_appsync_apiKey,
type: awsConfig.aws_appsync_authenticationType, // 'AMAZON_COGNITO_USER_POOLS'
jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken()
},
disableOffline: true,
};
const apolloClientOptions = {
link: createAppSyncLink({
...appSyncClientOptions,
resultsFetcherLink: createHttpLink({ uri: appSyncClientOptions.url, fetch })
})
};
const client = new Client(appSyncClientOptions, apolloClientOptions);
const WithProvider = () => (
<ApolloProvider client={client}>
<Rehydrated>
<GqlList />
</Rehydrated>
</ApolloProvider>
)
export default WithProvider;
if(!process.browser){
global.fetch=require('node-fetch')
}
常量appSyncClientOptions={
url:awsConfig.aws_appsync_graphqlenpoint,
地区:awsConfig.aws_appsync_地区,
认证:{
//键入:“API_密钥”,
//apiKey:awsConfig.aws\u appsync\u apiKey,
类型:awsConfig.aws\u appsync\u authenticationType,//“AMAZON\u COGNITO\u用户\u池”
jwtToken:async()=>(等待Auth.currentSession()).getAccessToken().getJwtToken()
},
disableOffline:对,
};
常量客户端选项={
链接:createAppSyncLink({
…appSyncClientOptions,
resultsFetcherLink:createHttpLink({uri:appSyncClientOptions.url,fetch})
})
};
const client=新客户端(appSyncClientOptions、apolloClientOptions);
const with provider=()=>(
)
使用提供者导出默认值;
这是正确的,它确实可以自动工作。但是,我的Amplify config对象中缺少了Auth.identityPoolId
属性。除了我的问题中显示的区域
、用户池ID
和用户池WebClientID
属性外,还需要此属性。您如何知道Amplify.configure接受哪些对象(以及什么结构)?请注意,此答案是使用aws appsync的AMAZON_COGNITO_用户池
,正如我在问题中明确提到的,不带Amplify的AWS_IAM。这可能会让寻找答案的人感到困惑。我认为最初的问题有点不清楚。作者声明“注意,我直接使用Cognito用户池进行身份验证…”但您的观点很好地理解了AWS_IAM和AMAZON_Cognito_用户池之间的区别
if (!process.browser) {
global.fetch = require('node-fetch')
}
const appSyncClientOptions = {
url: awsConfig.aws_appsync_graphqlEndpoint,
region: awsConfig.aws_appsync_region,
auth: {
// type: 'API_KEY',
// apiKey: awsConfig.aws_appsync_apiKey,
type: awsConfig.aws_appsync_authenticationType, // 'AMAZON_COGNITO_USER_POOLS'
jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken()
},
disableOffline: true,
};
const apolloClientOptions = {
link: createAppSyncLink({
...appSyncClientOptions,
resultsFetcherLink: createHttpLink({ uri: appSyncClientOptions.url, fetch })
})
};
const client = new Client(appSyncClientOptions, apolloClientOptions);
const WithProvider = () => (
<ApolloProvider client={client}>
<Rehydrated>
<GqlList />
</Rehydrated>
</ApolloProvider>
)
export default WithProvider;