从Lambda函数访问Congito授权的AppSync API

时间:2019-01-16 09:55:24

标签: amazon-web-services aws-lambda amazon-cognito aws-appsync

我想从Lambda函数调用AppSync API上的变异,以响应外部事件。现在,如果我将AppSync设置为使用IAM授权,然后以Lambda函数的角色提供访问权限,则已经可以执行此操作。问题是我需要使用Cognito授权,因为我需要访问许多解析器模板中的Cognito用户名,并且在使用IAM授权时我不知道有什么方法可以实现此目的。

因此,我想知道是否可以使用Cognito用户池调用Lambda函数来调用AppSync端点。显然,我可以在我的池中创建一个虚拟用户,然后简单地在Lambda中使用它登录,但是Cognito用户池登录是一个非常缓慢的过程,无论如何这种方法听起来都是错误的。我想从Lambda调用的变异无论如何都不需要任何Cognito信息。

还可以解决我的问题的是,当我使用IAM授权时是否可以访问解析器模板中的Cognito用户名。

2 个答案:

答案 0 :(得分:0)

使用用户池作为您的身份验证机制,在某些时候,如果没有登录就无法获得令牌来使用AWS AppSync进行授权。话虽如此,您可以减轻一点开销。最终,它可以归结为您使用“假用户”提出的问题。这不是一个不常见的解决方案,它涉及到一些管理员级别的用户,这些凭据只能从此Lambda中访问。

首先,由于延迟原因,我建议您不要使用传统的SRP登录。一种替代方法是使用AdminInitiateAuth / ADMIN_NO_SRP_AUTH,从Lambda到Cognito后端上卸载SRP计算的开销,并在池中打开ADMIN_NO_SRP_AUTH。我从另一个问题(Authenticate AppSync request with adminInitiateAuth)中看到您正在考虑这样做,但是重要的是要指出这只是用于登录用户的不同API。您可以在此处了解更多信息{3}}

另一种选择是自定义身份验证流程。上面的同一链接提供了有关执行此操作的更多详细信息,但简而言之,您可以设置一个更快的流程,以适合您添加的特定需求。

要进一步提高开销,您可以在某种程度上保留这些令牌。那可能只是意味着将其保存在Lambda中的内存中,并在使用它们之前检查其有效性/有效期,甚至附加远程缓存机制。

答案 1 :(得分:-1)

@Gerharddc,如果您尝试添加允许未经身份验证的访问您的Cognito身份池的策略怎么办?

我有一段这段代码定义了对身份池的经过身份验证和未经身份验证的访问(您可以在我的个人project中查看完整的代码)。

IdentityPoolUnauthorizedIAMRole:
    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 CognitoIdentityPool
              ForAnyValue:StringLike:
                cognito-identity.amazonaws.com:amr: unauthenticated
      Policies:
        - PolicyName: CognitoUserSignInUnauthorizedPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - mobileanalytics:PutEvents
                  - mobiletargeting:PutEvents
                  - cognito-sync:*
                  - cognito-identity:*
                Resource: '*'

  IdentityPoolAuthorizedIAMRole:
    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 CognitoIdentityPool
              ForAnyValue:StringLike:
                cognito-identity.amazonaws.com:amr: authenticated
      Policies:
        - PolicyName: CognitoUserSignInAuthorizedPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - mobileanalytics:PutEvents
                  - mobiletargeting:PutEvents
                  - cognito-sync:*
                  - cognito-identity:*
                Resource: '*'

  # Assigns the roles to the Identity Pool
  CognitoIdentityPoolRoleAttachment:
    Type: AWS::Cognito::IdentityPoolRoleAttachment
    Properties:
      IdentityPoolId: !Ref CognitoIdentityPool
      Roles:
        unauthenticated: !GetAtt IdentityPoolUnauthorizedIAMRole.Arn
        authenticated: !GetAtt IdentityPoolAuthorizedIAMRole.Arn

在声明我的AWS AppSync模板时,我添加了此template,允许用户登录后访问我的AppSync端点:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - !Join ['/', [!GetAtt AppSyncGraphQLApi.Arn, '*']]
      PolicyName: !Sub ${StackName}-appsync-iam-policy
      Roles:
        - !Sub ${IdentityPoolAuthorizedIAMRoleRef}

我的意思是:您可以附加一个策略,该策略允许用户not signed(未经身份验证)访问AppSync。相反,您可以在上面的模板中- !Sub ${IdentityPoolAuthorizedIAMRoleRef},可以尝试- !Sub ${IdentityPoolUnauthorizedIAMRoleRef}

当然,您可以指定允许未经认证的访问endpoints,例如:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when NOT signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>
      PolicyName: !Sub ${StackName}-appsync-iam-policy-unauthenticated
      Roles:
        - !Sub ${IdentityPoolUnauthorizedIAMRoleRef}