AWS在一个GraphQL Api中使用多个Cognito用户池进行放大

问题描述

我是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密钥... 但是它支持两种认知类型吗?

谢谢

解决方法

根据AWS documentation,您可以使用两个非常简单的方法,使用两个不同的认知组来访问相同的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表使用两个不同的用户池,那么您将需要花更多的精力来实现这一目标。步骤如下:

  1. 将您的两个用户池都添加为其他授权 提供程序
  2. 在查询中使用@aws_cognito_user_pools指令, 这些查询和变异试图访问的架构和对象中的变异。
  3. 这是一个棘手的问题!当您尝试在您的查询/突变解析器中访问$ctx.identity.cognitoIdentityPoolId时,它将抛出null。因为cognitoIdentityPoolId仅包含在AWS_IAM授权标头中,而不包含在AWS_COGNITO_USER_POOLS [Ref.]中。但是,您仍然可以从iss的{​​{1}}字段中获取用户池ID,其外观类似于$ctx.identity.claimshttps://cognito-idp.us-xxxx-x.amazonaws.com/us-xxxx-X_XxxXxxXX是您必须以某种方式解析的用户池ID。
  4. 解析用户池ID后,您可以根据以下内容过滤用户 Cognito池ID,然后向他们授予对您表的访问权限 欲望。