通过身份池联合的开发人员身份验证身份无法在 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 中调用 GetOpenIdTokenForDeveloperIdentityGetCredentialsForIdentity,并使用 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 调用的主要内容,如果未能解决你的问题,请参考以下文章

Cognito:联合身份 ID 和用户属性

AWS Amplify 与托管 Cognito UI 的联合 Okta 身份验证

Webpack 5 模块联合:使用身份验证访问远程模块

AWS Cognito 角色:区分联合身份池角色和用户池组角色

如何使用Facebook验证使用Cognito的API调用?

使用 JWT 联合身份的 REST 身份验证/授权