如何通过API Gateway将Cognito用户池组传递给Lambda上下文?

时间:2019-09-26 19:03:12

标签: amazon-web-services aws-lambda aws-api-gateway amazon-cognito

我在使用Lambda代理集成的API网关后面有几个Lambda函数。每个功能都由AWS_IAM授权者配置。我能够针对Cognito用户池成功进行身份验证,然后从Lambda事件中检索用户ID,如此处https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html所述。

但是,我一直在努力获取经过身份验证的用户所属的用户池组的列表。理想情况下,由于Cognito授权者已经拥有此信息,因此它们将作为事件的一部分被传递。我已经提到过将映射添加到该方法的Integration Request的提及,但这在使用Lambda代理集成时似乎不是一个选择。

我也很幸运地尝试了所有建议。 https://github.com/aws-amplify/amplify-js/issues/390

1 个答案:

答案 0 :(得分:1)

我简直不敢相信他们只是没有将其传递给我。这就是我所做的:

1。修改serverless.yaml以获得权限:

    - Effect: Allow
      Action:
        - cognito-idp:AdminListGroupsForUser
      Resource: ${self:custom.userPoolArn}

这让我的lambda函数可以访问AdminListGroupsForUser函数。

2。在lambda函数中获取Cognito组

使用referenced here的字符串解析功能,可以获得UserPoolUserId和UserPoolId。我的lambda代码在python中,但它的想法相同:

auth_provider = event['requestContext']['identity']['cognitoAuthenticationProvider']
userPoolUserId = parts[-1] # the last part of the list
userPoolId = parts[0].split('/')[-1]

然后将这些值传递给您在上一步中授予权限的AdminListGroupsForUser

cognito = boto3.client('cognito-idp')
groups = cognito.admin_list_groups_for_user(
            UserPoolId = userPoolId,
            Username = userPoolUserId
            )
print(groups)

然后,您将获得它们所属的所有组的哈希。如果有很多组,则可以将其他参数传递给AdminListGroupsForUser以获取它们。希望对您有用!