问题描述
我是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表使用两个不同的用户池,那么您将需要花更多的精力来实现这一目标。步骤如下:
- 将您的两个用户池都添加为其他授权 提供程序。
- 在查询中使用
@aws_cognito_user_pools
指令, 这些查询和变异试图访问的架构和对象中的变异。 - 这是一个棘手的问题!当您尝试在您的查询/突变解析器中访问
$ctx.identity.cognitoIdentityPoolId
时,它将抛出null。因为cognitoIdentityPoolId
仅包含在AWS_IAM
授权标头中,而不包含在AWS_COGNITO_USER_POOLS
[Ref.]中。但是,您仍然可以从iss
的{{1}}字段中获取用户池ID,其外观类似于$ctx.identity.claims
。https://cognito-idp.us-xxxx-x.amazonaws.com/us-xxxx-X_XxxXxxXX
是您必须以某种方式解析的用户池ID。 - 解析用户池ID后,您可以根据以下内容过滤用户 Cognito池ID,然后向他们授予对您表的访问权限 欲望。