通过身份池联合的开发人员身份验证身份无法在 Amplify 项目中进行 AppSync 调用
Posted
技术标签:
【中文标题】通过身份池联合的开发人员身份验证身份无法在 Amplify 项目中进行 AppSync 调用【英文标题】:Developer authenticated identities federated via an Identity Pool cannot make AppSync calls in Amplify project 【发布时间】:2020-01-18 15:40:00 【问题描述】:目前,我正在验证 Linkedin 用户并在 Lambda 中调用 GetOpenIdTokenForDeveloperIdentity
和 GetCredentialsForIdentity
,并使用 Auth.federatedSignIn()
登录这些用户,我能够检索当前经过身份验证的用户和凭据。
但是,使用 Amplify 的 APIClass 或 AWSAppSyncClient,我无法让这些用户通过 AppSync 进行 GraphQL 调用,AppSync 配置为授权 Cognito 用户池和 AWS IAM 用户。当身份验证类型相应更改时,Cognito 用户池用户在进行 AppSync 调用时没有问题。
我已经为联合用户尝试了以下各项:
API.graphql(
query: queries.getUserProfile,
variables:
input:
email,
,
authMode: 'AWS_IAM'
)
const client = new AWSAppSyncClient(
url: process.env.GRAPHQL_ENDPOINT,
region: process.env.AWS_REGION,
auth:
type: AUTH_TYPE.AWS_IAM,
credentials: async () => Auth.currentCredentials(),
,
disableOffline: true,
);
client.query(
query: gql(queries.getUserProfile),
variables:
input:
email,
,
,
fetchPolicy: 'no-cache',
)
身份池是通过无服务器资源/CloudFormation 模板提供的,我设置了信任关系和经过身份验证的角色,如下所示:
ProjectAuthRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Federated: "cognito-identity.amazonaws.com"
Action:
- "sts:AssumeRoleWithWebIdentity"
Condition:
StringEquals:
"cognito-identity.amazonaws.com:aud":
- Ref: ProjectIdentityPool
ForAnyValue:StringLike:
"cognito-identity.amazonaws.com:amr": authenticated
AuthPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- mobileanalytics:PutEvents
- cognito-sync:*
- cognito-identity:*
Resource:
- "*"
- Effect: Allow
Action:
- appsync:GraphQL
Resource:
- "*"
Roles:
- Ref: ProjectAuthRole
我已经能够通过将@aws_iam 架构指令添加到每个类型和输入定义来进行 GraphQL 调用,但听起来这甚至没有必要,因为授权应该在 AWS AppSync GraphQL API 级别进行。
还有什么我可能忘记配置的想法吗?
【问题讨论】:
【参考方案1】:看起来问题出在我们的 serverless-appsync-plugin YAML 文件中的 additionalAuthenticationProviders
。
我的理解是,如果您希望其他身份验证提供程序(在我们的例子中,AWS_IAM
)与默认身份验证提供程序(在我们的例子中,@987654324)一起访问,则必须将模式级指令应用于一个模式中的类型定义@)。
更多详情来源: https://docs.aws.amazon.com/appsync/latest/devguide/security.html#using-additional-authorization-modes
【讨论】:
以上是关于通过身份池联合的开发人员身份验证身份无法在 Amplify 项目中进行 AppSync 调用的主要内容,如果未能解决你的问题,请参考以下文章
AWS Amplify 与托管 Cognito UI 的联合 Okta 身份验证
AWS Cognito 角色:区分联合身份池角色和用户池组角色