0Pricing
Cloud & IT Cert Prep · 课时

授权:IAM、Lambda 授权方与 Cognito

使用 IAM SigV4 签名、自定义 Lambda 授权方或 Amazon Cognito 用户池授权方保护 API 端点。

授权:IAM、Lambda 授权方与 Cognito 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

API 授权为何重要

如果没有授权控制,任何互联网客户端都可以调用您的 API Gateway 端点,并访问或修改数据。API Gateway 提供三种原生授权机制:IAM(SigV4)、Lambda 授权器和Amazon Cognito 用户池授权器。每种机制适用于不同场景:IAM 用于 AWS 服务之间的调用,Lambda 授权器用于自定义令牌或基于请求的身份验证,Cognito 用于 Web/移动用户身份验证。

使用 SigV4 的 IAM 授权

IAM 授权要求调用方使用 AWS Signature Version 4(SigV4)对请求进行签名。调用方必须拥有 AWS 凭证(访问密钥和私密密钥,或来自 STS 的临时凭证),并且 IAM policy 必须允许对该 API 的 ARN 执行 execute-api:Invoke。这非常适合 AWS 内部的机器到机器(服务器到服务器)调用,例如 Lambda 调用另一个 API、EC2 调用内部 API,或跨账户服务访问。浏览器客户端无法轻松使用 SigV4。

# IAM policy to allow invoking a specific API endpoint
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Action': 'execute-api:Invoke',
    'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/prod/GET/orders'
  }]
}

Lambda 授权器:基于令牌

Lambda 授权器(以前称为自定义授权器)是您编写的 Lambda 函数,API Gateway 会在调用后端集成之前调用它。对于基于令牌的授权器,API Gateway 会从 Authorization 标头中提取令牌(JWT、OAuth、API key),并将其传递给您的 Lambda。您的 Lambda 会验证令牌(例如,使用公钥验证 JWT 签名,或调用第三方身份提供商),然后返回一个 IAM policy 文档,以允许或拒绝该请求。

def lambda_handler(event, context):
    token = event['authorizationToken']
    # Validate token (JWT verification, introspect OAuth, etc.)
    if is_valid_token(token):
        return {
            'principalId': 'user123',
            'policyDocument': {
                'Version': '2012-10-17',
                'Statement': [{'Effect': 'Allow', 'Action': 'execute-api:Invoke',
                                'Resource': event['methodArn']}]
            },
            'context': {'userId': 'user123', 'role': 'admin'}
        }
    raise Exception('Unauthorized')

Lambda 授权器:基于请求

对于基于请求的 Lambda 授权器,API Gateway 会将完整的请求上下文(标头、查询字符串、阶段变量、路径参数)传递给您的 Lambda,而不仅仅是令牌。这适用于依赖多个请求属性的授权场景,例如 IP 允许列表、标头组合或多重身份验证检查。REST API 和 HTTP API 都支持基于请求的授权器。

Lambda 授权器缓存

每个 API 请求都调用一次 Lambda 授权器,会增加延迟和成本。请启用授权器结果缓存:将授权器返回的 IAM policy 缓存一段可配置的 TTL(0–3600 秒),并以令牌值作为缓存键。后续使用相同令牌的请求会跳过 Lambda 调用,直接使用缓存的 policy。请将 TTL 设置为与令牌过期时间一致——如果令牌有效期为 1 小时,请将授权器结果缓存相同的时长。REST API 支持缓存;HTTP API JWT 授权器内置缓存功能。

Amazon Cognito 用户池授权器

Cognito 用户池授权器可以直接在 API Gateway 中验证Cognito 签发的 JWT,无需 Lambda 函数。当用户通过 Cognito(通过托管 UI、SDK 或联合身份提供商)进行身份验证时,Cognito 会签发 ID 令牌或访问令牌。客户端会将此令牌包含在 Authorization 标头中。API Gateway 会根据 Cognito 用户池验证令牌签名和过期时间。如果令牌有效,请求将继续处理;否则,API Gateway 会返回 401。

aws apigateway create-authorizer \
  --rest-api-id 'abc123' \
  --name 'CognitoAuthorizer' \
  --type COGNITO_USER_POOLS \
  --provider-arns 'arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_XXXXXXX' \
  --identity-source 'method.request.header.Authorization'

HTTP API 中的 JWT 授权器

HTTP API 原生支持JWT 授权器,无需 Lambda。您只需指定 JWT 颁发者 URL(Cognito、Auth0、Okta)和受众,API Gateway 就会自动验证 JWT。这本质上是 Cognito 用户池授权器,但也适用于任何符合标准的 OIDC 提供商。令牌验证(签名、过期时间、受众)由 API Gateway 在内部完成,相比 Lambda 授权器延迟更低且无需支付 Lambda 成本。

aws apigatewayv2 create-authorizer \
  --api-id 'abc123' \
  --authorizer-type JWT \
  --name 'JWTAuthorizer' \
  --identity-source '$request.header.Authorization' \
  --jwt-configuration '{
    "Issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXX",
    "Audience": ["your-client-id"]
  }'

Cognito 身份池与用户池

对于 API 授权,请使用Cognito 用户池:它负责管理用户身份验证并签发 JWT。Cognito 身份池(联合身份)则有所不同——它会将第三方令牌(来自用户池、社交登录、SAML)交换为临时 AWS 凭证(通过 STS AssumeRoleWithWebIdentity)。当您的应用需要从客户端直接访问 AWS 服务(S3、DynamoDB)时,应使用身份池。对于 API Gateway 授权,用户池 JWT 是正确的选择;身份池凭证用于浏览器或移动设备直接调用 AWS SDK。

API Gateway 上的资源策略

REST API 支持资源策略——附加到 API 的 JSON 策略,可根据 IP 地址、VPC 端点、源账户或 ARN 控制访问。您可以使用资源策略来:仅允许特定 IP 范围调用您的 API,限制只能通过特定 VPC 端点(私有 API)发送的请求,或允许跨账户调用。资源策略与方法级授权器共同生效——两者都必须允许该请求,请求才能成功。

# Allow only specific IP range to call the API
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': '*',
    'Action': 'execute-api:Invoke',
    'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/*',
    'Condition': {'IpAddress': {'aws:SourceIp': '203.0.113.0/24'}}
  }]
}

双向 TLS 身份验证

双向 TLS(mTLS)要求客户端和服务器在 TLS 握手期间都提供证书。当配置了自定义域名时,API Gateway 支持 REST API 和 HTTP API 使用 mTLS。客户端必须提供由您上传到 S3 信任库中的证书颁发机构(CA)签署的有效证书。mTLS 用于金融服务、IoT 设备身份验证以及 B2B 集成等场景,在这些场景中,除了基于令牌的身份验证之外,还需要进行强有力的客户端身份验证。

选择合适的授权器类型

SAA-C03 考试中的授权器选择:IAM(SigV4) → 同一账户或跨账户的 AWS 服务间调用;Cognito 用户池 → 通过 Cognito 进行身份验证的 Web/移动应用用户;Lambda 授权器 → 自定义身份验证逻辑(第三方身份提供商、旧版令牌格式、OAuth introspection、IP 与令牌组合);JWT 授权器(HTTP API) → 使用任何符合标准的提供商提供的 OIDC/OAuth2 令牌,成本低于 Lambda 授权器。无授权器 → 公共 API。

快速检查

测试您对本课 AWS Solutions Architect(SAA-C03)相关概念的理解。

课程回顾

本课介绍了:IAM(SigV4)授权适用于使用 AWS 凭证进行的服务间调用;Cognito 用户池授权器可以原生验证 Cognito 为 Web 和移动应用签发的 JWT;Lambda 授权器可以为第三方身份提供商或复杂的授权逻辑实现自定义令牌验证,并可选择缓存结果。接下来,我们将探讨 API Gateway 中的限流、缓存和使用计划。

常见问题解答

「授权:IAM、Lambda 授权方与 Cognito」课时是免费的吗?

是的 — 「授权:IAM、Lambda 授权方与 Cognito」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「授权:IAM、Lambda 授权方与 Cognito」这节课中我会学到什么?

使用 IAM SigV4 签名、自定义 Lambda 授权方或 Amazon Cognito 用户池授权方保护 API 端点。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「授权:IAM、Lambda 授权方与 Cognito」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. REST API、HTTP API 与 WebSocket API
  2. 集成:Lambda、HTTP 与模拟
  3. 授权:IAM、Lambda 授权方与 Cognito
  4. 节流、缓存与使用计划
← 返回 Cloud & IT Cert Prep