Aws Amplify 在一个 GraphQL Api 中使用多个 Cognito 用户池

Posted

技术标签:

【中文标题】Aws Amplify 在一个 GraphQL Api 中使用多个 Cognito 用户池【英文标题】:Aws Amplify Using Multiple Cognito User Pools in One GraphQL Api 【发布时间】:2020-12-22 11:06:24 【问题描述】:

我是 AWS Amplify 的新手,我正在尝试制作简单的项目。

我有两个不同的前端(反应)项目。其中一个用于博客读者,另一个用于编辑。对于这两个应用程序,我想使用相同的 DynamoDB 表(并使用 graphql api)。但我想为每个项目使用不同的用户池。我该如何实现?

我正在阅读这篇文章 - https://medium.com/@fullstackpho/aws-amplify-multi-auth-graphql-public-read-and-authenticated-create-update-delete-1bf5443b0ad1

我知道 AWS AppSync 支持多种授权类型,例如 cognito、api key ... 但是它支持两种认知类型吗?

谢谢,

【问题讨论】:

你是指 cognito group 还是 cognito user_pool by cognito type? 【参考方案1】:

根据 AWS documentation,您可以使用两个不同的 Cognito 组通过以下方式访问同一个 AppSync API 访问同一个 DynamoDB 表,这些方式非常简单;

如果你使用aws_auth 指令

type Query 
  getPosts:[Post!]! 
  @aws_auth(cognito_groups: ["Bloggers", "Readers"])

如果你使用aws_cognito_user_pools 指令

type Query 
  getPosts:[Post!]!
  @aws_api_key @aws_cognito_user_pools(cognito_groups: ["Bloggers", "Readers"])

现在,如果您特别希望为同一个 API 和 DynamoDB 表使用两个不同的用户池,那么您将不得不付出更多努力来实现这一点。步骤如下:

    将您的两个用户池添加为附加授权 供应商在您的 AppSync 设置中。 使用@aws_cognito_user_pools 指令处理您的查询和 架构中的突变以及这些查询和突变试图访问的对象。 这是一个棘手的问题!当您尝试在查询/突变解析器中访问 $ctx.identity.cognitoIdentityPoolId 时,它会将您抛出 null。因为cognitoIdentityPoolId 仅包含在AWS_IAM 授权标头中,而不包含在AWS_COGNITO_USER_POOLS [Ref.] 中。但是,您仍然可以从$ctx.identity.claims 中的iss 字段中获取用户池ID,它看起来类似于https://cognito-idp.us-xxxx-x.amazonaws.com/us-xxxx-X_XxxXxxXXus-xxxx-X_XxxXxxXX 是您的用户池 ID,您必须以某种方式对其进行解析。 解析用户池 ID 后,您可以根据 Cognito 池 ID,然后授予他们访问您的表的权限 渴望。

【讨论】:

两个用户池都必须是附加授权提供者吗?或者可以一个是默认的身份验证提供者,另一个是附加的?

以上是关于Aws Amplify 在一个 GraphQL Api 中使用多个 Cognito 用户池的主要内容,如果未能解决你的问题,请参考以下文章

带有 AWS Amplify 的 GraphQL - 如何启用对查询的排序

如何防止更新 AWS Amplify GraphQL API 的 ownerField?

AWS Amplify GraphQL Schema 导致错误

如果我有登录用户的访问令牌,如何使用 AWS Amplify GraphQL API?

AWS Amplify (GraphQL) - 使用“graphqlOperation”与普通查询?

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询