如何允许 API Gateway REST API 用户使用来自 Amazon Cognito 用户池组的执行角色运行 Lambda?

2 分钟阅读
0

我的带有 AWS Lambda 代理集成的 Amazon API Gateway REST API 具有 Amazon Cognito 用户池身份验证。如何允许用户使用其用户池组的 AWS Identity and Access Management(IAM)角色运行我的 Lambda 函数?

解决方法

**注意:**除了 Amazon Cognito 用户池之外,您还可以配置身份池,以授权对您的 API 的访问。有关更多信息,请参阅基于角色的访问控制

在将用户设置为可以使用其 Amazon Cognito 角色运行 Lambda 之前,请务必设置以下内容:

要允许用户使用其 Amazon Cognito 权限运行 Lambda,请按照以下步骤操作:

  1. 使用 API Gateway 控制台将您的 Amazon Cognito 用户池设置为授权方。然后,将 Amazon Cognito 用户池指定为您的 API 方法的授权方。有关说明,请参阅将 REST API 与 Amazon Cognito 用户池集成

  2. 打开 AWS Lambda 控制台

  3. 选择配置为 API 代理资源的 Lambda 函数。

  4. 配置 Lambda 函数,然后添加以下代码片段。此代码片段从事件详细信息中获取 Amazon Cognito 角色,然后代入该角色。

**注意:**要运行此代码片段,您的 Lambda IAM 角色必须具有访问 Amazon CloudWatch Logs 的权限。该角色还必须可以使用 AssumeRole API 调用才能执行 assume_role 命令。

import boto3
client = boto3.client('sts')
def lambda_handler(event, context):
    role=event['requestContext']['authorizer']['claims']['cognito:roles']
    response = client.assume_role(
        RoleArn=role,
        RoleSessionName='APIrole'
    )
    print(response)
    response2api = {"statusCode": 200,"headers": { },"body": "Success"}
    return response2api

一个用户可以属于多个 Amazon Cognito 用户池组,并且每个组可以具有不同的 IAM 角色。如果用户属于两个或更多组,则 cognito:roles 声明将返回角色列表。用户 ID 令牌中的 cognito:preferred_role 声明继承了具有最高优先级(最低优先级值)的组的 IAM 角色。有关更多信息,请参阅基于角色的访问控制

要获取 cognito:preferred_role,请使用以下代码片段:

role = event['requestContext']['authorizer']['claims']['cognito:preferred_role']

要验证用户是否可以使用其 Amazon Cognito 角色运行 Lambda,请按照以下步骤操作:

  1. 打开客户端应用程序,然后以 Amazon Cognito 用户池中的某个用户身份登录。

  2. 使用登录后收到的 ID 令牌调用您的 API。
    **注意:**确保使用返回的令牌中的 id_token 值。

  3. 确认您可以访问在 Amazon Cognito 用户池角色中定义的相同资源。

  4. (可选)检查 CloudWatch Logs,验证 assume_role 命令是否执行成功。

**注意:**如果您使用 API Gateway Lambda 授权方来授权访问您的 API,则请使用经过授权方验证的用户池令牌。在代入令牌角色之前,必须验证令牌。

相关信息

以授权方身份使用 Amazon Cognito 用户池控制对 REST API 的访问

使用 Lambda 集成构建 API Gateway REST API

AWS Lambda 执行角色

AWS 官方
AWS 官方已更新 1 年前