配置 API Gateway Lambda 授权方 - Amazon API Gateway

配置 API Gateway Lambda 授权方

创建 Lambda 函数后,您可以将 Lambda 函数配置为您的 API 的授权方。然后,您可以将方法配置为调用 Lambda 授权方,以确定调用方是否可以调用该方法。您可以在创建 API 的相同账户或不同账户中创建 Lambda 函数。

您可以使用 API Gateway 控制台中的内置工具或使用 Postman 来测试 Lambda 授权方。有关如何使用 Postman 测试 Lambda 授权方函数的说明,请参阅使用 API Gateway Lambda 授权方调用 API

配置 Lambda 授权方(控制台)

以下过程介绍如何在 API Gateway REST API 控制台中创建 Lambda 授权方。要详细了解不同类型的 Lambda 授权方,请参阅选择 Lambda 授权方类型

REQUEST authorizer
配置 REQUEST Lambda 授权方
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择一个 API,然后选择授权方

  3. 选择创建授权方

  4. 对于授权方名称,输入授权方名称。

  5. 对于授权方类型,选择 Lambda

  6. 对于 Lambda 函数,选择您在其中创建 Lambda 授权方函数的 AWS 区域,然后输入函数名称。

  7. Lambda 调用角色留空,以允许 API Gateway REST API 控制台设置基于资源的策略。此策略授予 API Gateway 调用 Lambda 授权方函数的权限。您还可以选择输入 IAM 角色的名称,以允许 API Gateway 调用 Lambda 授权方函数。有关角色示例,请参阅创建一个可代入的 IAM 角色

  8. 对于 Lambda 事件负载,选择请求

  9. 身份来源类型中,选择一个参数类型。支持的参数类型为 HeaderQuery stringStage variableContext。要添加更多身份来源,请选择添加参数

  10. 要缓存授权方生成的授权策略,请将授权缓存保持开启状态。在启用策略缓存后,您可以修改 TTL 值。将 TTL 设置为零将禁用策略缓存。

    如果启用缓存,授权方必须返回适用于 API 中所有方法的策略。要强制执行特定于方法的策略,请使用上下文变量 $context.path$context.httpMethod

  11. 选择创建授权方

TOKEN authorizer
配置 TOKEN Lambda 授权方
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择一个 API,然后选择授权方

  3. 选择创建授权方

  4. 对于授权方名称,输入授权方名称。

  5. 对于授权方类型,选择 Lambda

  6. 对于 Lambda 函数,选择您在其中创建 Lambda 授权方函数的 AWS 区域,然后输入函数名称。

  7. Lambda 调用角色留空,以允许 API Gateway REST API 控制台设置基于资源的策略。此策略授予 API Gateway 调用 Lambda 授权方函数的权限。您还可以选择输入 IAM 角色的名称,以允许 API Gateway 调用 Lambda 授权方函数。有关角色示例,请参阅创建一个可代入的 IAM 角色

  8. 对于 Lambda 事件负载,选择令牌

  9. 对于令牌来源,输入包含授权令牌的标头名称。客户端必须包括此标头名称才能将授权令牌发送到 Lambda 授权方。

  10. (可选)对于令牌验证,请输入正则表达式语句。API Gateway 将针对此表达式执行对输入令牌的初始验证并在成功验证后调用授权方。

  11. 要缓存授权方生成的授权策略,请将授权缓存保持开启状态。在启用策略缓存后,令牌来源中指定的标头名称将成为缓存键。在启用策略缓存后,您可以修改 TTL 值。将 TTL 设置为零将禁用策略缓存。

    如果启用缓存,授权方必须返回适用于 API 中所有方法的策略。要强制执行特定于方法的策略,您可以关闭授权缓存

  12. 选择创建授权方

创建 Lambda 授权方后,您可以对其进行测试。以下过程介绍如何测试 Lambda 授权方。

REQUEST authorizer
测试 REQUEST Lambda 授权方
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择授权方的名称。

  3. 测试授权方下,输入身份来源的值。

    如果您使用的是 REQUEST 授权方 Lambda 函数示例,请执行以下操作:

    1. 选择标头并输入 headerValue1,然后选择添加参数

    2. 身份来源类型下,选择查询字符串并输入 queryValue1,然后选择添加参数

    3. 身份来源类型下,选择阶段变量并输入 stageValue1

    您无法修改测试调用的上下文变量,但可以修改 Lambda 函数的 API Gateway 授权方测试事件模板。然后,您可以使用修改后的上下文变量来测试 Lambda 授权方函数。有关更多信息,请参阅《AWS Lambda 开发人员指南》中的在控制台中测试 Lambda 函数

  4. 选择测试授权方

TOKEN authorizer
测试 TOKEN Lambda 授权方
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择授权方的名称。

  3. 测试授权方下,输入令牌的值。

    如果您使用的是 TOKEN 授权方 Lambda 函数示例,请执行以下操作:

    1. 对于 authorizationToken,请输入 allow

  4. 选择测试授权方

    如果 Lambda 授权方成功拒绝了测试环境中的请求,测试将返回 200 OK HTTP 响应。但在测试环境之外,API Gateway 将返回 403 Forbidden HTTP 响应并且方法请求将失败。

配置 Lambda 授权方(AWS CLI)

以下 create-authorizer 命令演示了如何使用 AWS CLI 创建 Lambda 授权方。

REQUEST authorizer

以下示例创建 REQUEST 授权方并使用 Authorizer 标头和 accountId 上下文变量作为身份来源:

aws apigateway create-authorizer \ --rest-api-id 1234123412 \ --name 'First_Request_Custom_Authorizer' \ --type REQUEST \ --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \ --identity-source 'method.request.header.Authorization,context.accountId' \ --authorizer-result-ttl-in-seconds 300
TOKEN authorizer

以下示例创建 TOKEN 授权方并使用 Authorization 标头作为身份来源:

aws apigateway create-authorizer \ --rest-api-id 1234123412 \ --name 'First_Token_Custom_Authorizer' \ --type TOKEN \ --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \ --identity-source 'method.request.header.Authorization' \ --authorizer-result-ttl-in-seconds 300

创建 Lambda 授权方后,您可以对其进行测试。以下 test-invoke-authorizer 命令演示了如何测试 Lambda 授权方:

aws apigateway test-invoke-authorizer --rest-api-id 1234123412 \ --authorizer-id efg1234 \ --headers Authorization='Value'

配置方法以使用 Lambda 授权方(控制台)

配置 Lambda 授权方后,必须将其附加到 API 方法。

配置 API 方法以使用 Lambda 授权方
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 API。

  3. 选择资源,然后选择一种新方法或选择现有方法。

  4. 方法请求选项卡上的方法请求设置下,选择编辑

  5. 对于授权方,从下拉菜单中选择您刚刚创建的 Lambda 授权方。

  6. (可选)如果您希望将授权令牌传递到后端,请选择 HTTP 请求标头。选择添加标头,然后添加授权标头的名称。在名称中,输入标头名称,该名称必须与您在为 API 创建 Lambda 授权方时指定的令牌来源名称相匹配。此步骤不适用于 REQUEST 授权方。

  7. 选择 Save

  8. 选择部署 API,将 API 部署到某个阶段。对于使用阶段变量的 REQUEST 授权方,您还必须在阶段页面中定义必需的阶段变量并指定其值。

配置 API 方法以使用 Lambda 授权方(AWS CLI)

配置 Lambda 授权方后,必须将其附加到 API 方法。您可以创建新方法或使用补丁操作将授权方附加到现有方法。

以下 put-method 命令演示了如何创建使用 Lambda 授权方的新方法:

aws apigateway put-method --rest-api-id 1234123412 \ --resource-id a1b2c3 \ --http-method PUT \ --authorization-type CUSTOM \ --authorizer-id efg1234

以下 update-method 命令演示了如何更新现有方法以使用 Lambda 授权方:

aws apigateway update-method \ --rest-api-id 1234123412 \ --resource-id a1b2c3 \ --http-method PUT \ --patch-operations op="replace",path="/authorizationType",value="CUSTOM" op="replace",path="/authorizerId",value="efg1234"