非登录用户的 Appsync 授权

Appsync Authorization for Non Signed In Users

我在 Vue 应用程序中使用 Appsync 并设置了 Cognito 用户池,以便用户能够登录到我的应用程序。但是,我的应用程序中有一些页面,其中未登录的用户应该只能查看,即: "think: reading answers on stack overflow" ,但是在某些情况下,用户需要能够向该页面添加评论并且需要登录以对其进行编辑。

在 Appsync 中的 API 上,我将授权设置为 "Amazon Cognito User Pool",将默认操作设置为 "Allow",但是我怎样才能使非认知用户仍然可以查看页面?我应该使用哪种设置组合?

令人恼火的是,AppSync 不支持多种身份验证方法,正如您所注意到的,Cognito UserPool 集成要求用户先登录,然后才能访问 graphql 端点。

有一些解决方法,但是 none 其中非常好:

  • 部署两个版本 - 一个使用 UserPools 具有完整功能,另一个使用 API 密钥(嵌入客户端)的开放版本
  • 自行处理身份验证。为 App Sync 使用 IAM 角色安全性,而不是直接连接到 graphql 端点,而是在 API 网关中创建一个代理 lambda 来验证 UserPool 用户或允许没有凭据的有限访问。
  • 使用已知(例如,在您的应用程序中或来自端点)凭据在您的用户池中创建一个无用户"user"。然后,您有责任在响应安全 mutations/queries 时检查您的用户是否是 this 用户。更安全地执行此操作的一种方法可能是添加自定义属性 "custom:insecure",您可以在非开放端点上检查该属性。
  • 使用 "viewer" 模式(查看 Facebook 的实施)。让你的 GraphQL Schema 默认打开(例如已知 API 键)并让你所有的 queries/mutations 都采用 viewer 的第一个参数。这可能是 Cognito returns 在身份验证时使用的访问令牌。然后,每个解析器将负责确定令牌是否有效(例如cognito::getUser)或在没有定义 viewer 的情况下是否允许访问。

虽然最初听起来是最难的,但我会推荐我的第一个解决方案。有多种方法可以自动执行 AppSync 部署,它清楚地区分 架构上的开放内容和安全内容。