如何使用 API Gateway 将 Cognito 用户池组传递到 Lambda 上下文?

Ted*_*dOC 5 amazon-web-services amazon-cognito aws-lambda aws-api-gateway

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

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

我也尝试了这里的所有建议,但都没有成功。https://github.com/aws-amplify/amplify-js/issues/390

val*_*ard 5

我不敢相信他们只是不传递这个。这就是我所做的:

1.修改serverless.yaml获取权限:

    - Effect: Allow
      Action:
        - cognito-idp:AdminListGroupsForUser
      Resource: ${self:custom.userPoolArn}
Run Code Online (Sandbox Code Playgroud)

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

2.在lambda函数中获取Cognito组

使用您在此处引用的字符串解析函数,您可以获得 UserPoolUserId 和 UserPoolId。我的 lambda 代码在 python 中,但它的想法相同:

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

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

cognito = boto3.client('cognito-idp')
groups = cognito.admin_list_groups_for_user(
            UserPoolId = userPoolId,
            Username = userPoolUserId
            )
print(groups)
Run Code Online (Sandbox Code Playgroud)

然后,您将获得他们所属的所有组的哈希值。如果有一堆组,您可以传递其他参数AdminListGroupsForUser来获取它们。希望对你有用!