javascript - 如何使用 Cognito 身份池和 Amplify 连接到 AWS AppSync
问题描述
我有一个使用 IAM 角色进行身份验证的 AWS AppSync API。我正在使用 Amplify GraphQL 客户端连接到 AppSync 服务器。下图描述了获取 IAM 凭证所需执行的步骤,我假设 Amplify 能够执行这些步骤。但是,我找不到任何有关如何设置工作示例的文档。
请注意,我直接使用 Cognito 用户池进行身份验证,而不是像 Google 或 Facebook 这样的外部提供商。
到目前为止,我能够对用户进行身份验证并获得 JWT 令牌(步骤 1):
const Amplify = require('aws-amplify').default
const { Auth } = require('aws-amplify')
Amplify.configure({
Auth: {
region: process.env.AWS_REGION,
userPoolId: process.env.COGNITO_USERPOOL_ID,
userPoolWebClientId: process.env.COGNITO_WEBCLIENT_ID,
},
})
Auth.signin(username, password)
.then((user) => {
const token = user.idToken.jwtToken
// I've got the token - what next?
})
如何从身份池请求 IAM 凭证(步骤 2),并使用它们通过 Amplify 访问 AppSync API(步骤 3)?
如果 Amplify 本身无法获取凭证,我可以使用AWS.CognitoIdentityCredentials
AWS 开发工具包来请求它们,但是,我看不到将它们传递给 Amplify 以验证 API 请求的方法(请参阅我为更多细节)。
解决方案
我能够使用 cognito 对我的客户端进行身份验证,然后将 jwtToken 传递给 aws-appsync 客户端,以便能够将 APPSYNC 与 AMAZON_COGINITO_USER_POOLS 一起使用。同样在代码中,您将看到我在哪里使用 API_KEY 作为替代方案。我将 API_KEY 注释掉了。对于那些也想尝试使用 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;
推荐阅读
- c# - 如何使用 TestServer 和 Antiforgery 修复 POST 集成测试的 500 内部服务器错误?ASP.NET 核心
- google-analytics - 如何根据谷歌分析中的主观现场行为将用户划分为“最喜欢的类别”
- python-3.x - 如何修复“无法在内部使用几何管理器网格。已经有由包管理的奴隶'
- excel - 如何在 Excel 中创建一个 IF 函数来汇总特定时间之间显示的客人数量?
- javascript - 这个绑定在哪里,es6 和 es5 ECMAScript 定义与那些有什么区别?
- html - 如何从电子应用程序中的 [mat-icon] 按钮中删除工具提示?
- reactjs - 如何修复在反应中返回 NaN 的事件处理程序中的调用索引?
- javascript - React/Webpack/Django - 未捕获的类型错误:无法读取未定义的属性“XXX”
- android-studio-3.3 - 断点在 Android Studio 3.3 中不起作用
- java - 将 3 个不同数组的所有值转换为它们的绝对值并返回所有 3 个的方法只保持第一个数组而不是接下来的两个