当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变

Posted

技术标签:

【中文标题】当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变【英文标题】:How to authenticate Lambda generated mutations when AWS AppSync using Cognito 【发布时间】:2018-10-21 09:38:45 【问题描述】:

目前 AWS AppSync 只能订阅突变,这是获取实时更新的唯一方法。但是,如果对 AppSync 之外的支持数据进行了更改(例如来自 Lambda 函数的 DynamoDB 更新),那么我们如何通知客户端呢?

我能看到的唯一解决方案是使用“本地”解析器创建一个突变,并让更新 DynamoDB 的 Lambda 调用这个突变。但我的问题是 AppSync 身份验证在我的情况下设置为 Cognito。

我尝试在我的 Lambda 角色中授予 IAM 对 appsync:GraphQL 的访问权限,但直到我将 AppSync 中的身份验证类型从 Cognito 更改为 IAM 后才奏效。但是当然 Cognito 身份验证不适用于 Web 客户端。

我的 Lambda 函数是否必须通过 Cognito 使用用户名和密码进行身份验证才能触发突变?还是有其他方法可以从 Lambda 通知客户?

【问题讨论】:

我假设您最初将其设置为使用 Cognito 用户池进行 AppSync 访问。您是否尝试过通过与您的用户池关联的 Cognito Federated Identity 服务获取凭证并使用适当配置的经过身份验证的身份策略并将这些凭证用于 IAM 访问 AppSync? 啊。因此,将身份验证类型设置为 IAM,然后在客户端调用 AppSync 时从 Cognito 身份验证中提取 IAM 凭证。我会试一试并报告。 @hatboyzero 效果很好。将您的评论作为答案输入,我会将其标记为正确。 Lambda 可以像浏览器客户端代码一样使用ApolloClient“调用”突变。亚马逊最近修复了他们的客户端库,使其在浏览器之外运行,您只需要导入 isomorphic-fetch 感谢您的帮助!我最终使用 axios 用普通的 HTTP 请求解决了它。 【参考方案1】:

您需要将 AppSync 身份验证类型设置为 IAM,并通过与您的 Cognito 用户池关联的 Cognito Federated Identity 服务获取 AWS 凭证,并使用适当配置的身份验证身份策略。然后,您应该能够将这些凭证用于 IAM 访问 AppSync。

【讨论】:

使用 AWS Amplify 非常简单。登录后只需致电Auth.currentCredentials() 那么您在 lambda 中使用了 AWS Amplify? 否 - OP 提到,为了授予 lambda 访问 AppSync 端点的权限,他们必须将 AppSync 的 Auth 类型更改为 IAM 而不是 Cognito 用户池,但他们的客户端使用的是 Cognito身份验证的用户池。我只是建议他们需要如何从 Cognito 联合身份服务中获取 IAM 凭证,以用于客户端的 IAM 身份验证。

以上是关于当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify (AppSync + Cognito) 使用每个组织/租户的动态组进行授权

具有 Cognito 联合身份的 AWS AppSync IAM 授权

AWS Amplify AppSync 使用在 Cognito 中创建的 Google 用户登录

具有公共/私有访问权限的 Appsync 身份验证,无需 AWS Cognito

使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端

在 Graphql 操场上使用 AWS Cognito 用户池对 AppSync 突变进行身份验证