

# 配置 API Gateway Lambda 授权方
<a name="configure-api-gateway-lambda-authorization"></a>

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

您可以使用 API Gateway 控制台中的内置工具或使用 [Postman](https://www.postman.com/) 来测试 Lambda 授权方。有关如何使用 Postman 测试 Lambda 授权方函数的说明，请参阅[使用 API Gateway Lambda 授权方调用 API](call-api-with-api-gateway-lambda-authorization.md)。

## 配置 Lambda 授权方（控制台）
<a name="configure-api-gateway-lambda-authorization-with-console"></a>

 以下过程介绍如何在 API Gateway REST API 控制台中创建 Lambda 授权方。要详细了解不同类型的 Lambda 授权方，请参阅[选择 Lambda 授权方类型](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-choose)。

------
#### [ REQUEST authorizer ]

**配置 `REQUEST` Lambda 授权方**

1. 通过以下网址登录到 API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择一个 API，然后选择**授权方**。

1. 选择**创建授权方**。

1. 对于**授权方名称**，输入授权方名称。

1. 对于**授权方类型**，选择 **Lambda**。

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

1. 将 **Lambda 调用角色**留空，以允许 API Gateway REST API 控制台设置基于资源的策略。此策略授予 API Gateway 调用 Lambda 授权方函数的权限。您还可以选择输入 IAM 角色的名称，以允许 API Gateway 调用 Lambda 授权方函数。有关角色示例，请参阅[创建一个可代入的 IAM 角色](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies)。

1. 对于 **Lambda 事件负载**，选择**请求**。

1. 在**身份来源类型**中，选择一个参数类型。支持的参数类型为 `Header`、`Query string`、`Stage variable` 和 `Context`。要添加更多身份来源，请选择**添加参数**。

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

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

1. 选择**创建授权方**。

------
#### [ TOKEN authorizer ]

**配置 `TOKEN` Lambda 授权方**

1. 通过以下网址登录到 API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择一个 API，然后选择**授权方**。

1. 选择**创建授权方**。

1. 对于**授权方名称**，输入授权方名称。

1. 对于**授权方类型**，选择 **Lambda**。

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

1. 将 **Lambda 调用角色**留空，以允许 API Gateway REST API 控制台设置基于资源的策略。此策略授予 API Gateway 调用 Lambda 授权方函数的权限。您还可以选择输入 IAM 角色的名称，以允许 API Gateway 调用 Lambda 授权方函数。有关角色示例，请参阅[创建一个可代入的 IAM 角色](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies)。

1. 对于 **Lambda 事件负载**，选择**令牌**。

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

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

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

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

1. 选择**创建授权方**。

------

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

------
#### [ REQUEST authorizer ]

**测试 `REQUEST` Lambda 授权方**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择授权方的名称。

1. 在**测试授权方**下，输入身份来源的值。

   如果您使用的是 [`REQUEST` 授权方 Lambda 函数示例](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-request-lambda-function-create)，请执行以下操作：

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

   1. 在**身份来源类型**下，选择**查询字符串**并输入 **queryValue1**，然后选择**添加参数**。

   1. 在**身份来源类型**下，选择**阶段变量**并输入 **stageValue1**。

   您无法修改测试调用的上下文变量，但可以修改 Lambda 函数的 **API Gateway 授权方**测试事件模板。然后，您可以使用修改后的上下文变量来测试 Lambda 授权方函数。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[在控制台中测试 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html)。

1. 选择**测试授权方**。

------
#### [ TOKEN authorizer ]

**测试 `TOKEN` Lambda 授权方**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择授权方的名称。

1. 在**测试授权方**下，输入令牌的值。

   如果您使用的是 [`TOKEN` 授权方 Lambda 函数示例](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-token-lambda-function-create)，请执行以下操作：

   1. 对于 **authorizationToken**，请输入 **allow**。

1. 选择**测试授权方**。

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

------

## 配置 Lambda 授权方（AWS CLI）
<a name="configure-api-gateway-lambda-authorization-cli"></a>

以下 [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) 命令演示了如何使用 AWS CLI 创建 Lambda 授权方。

------
#### [ REQUEST authorizer ]

以下 [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) 命令创建 `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 ]

以下 [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) 命令创建 `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](https://docs.aws.amazon.com/cli/latest/reference/apigateway/test-invoke-authorizer.html) 命令测试 Lambda 授权方：

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

## 配置方法以使用 Lambda 授权方（控制台）
<a name="configure-api-gateway-lambda-authorization-method-console"></a>

配置 Lambda 授权方后，必须将其附加到 API 方法。如果授权方使用授权缓存，请务必更新策略以控制其它方法的访问权限。

**配置 API 方法以使用 Lambda 授权方**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择 API。

1. 选择**资源**，然后选择一种新方法或选择现有方法。

1. 在**方法请求**选项卡上的**方法请求设置**下，选择**编辑**。

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

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

1. 选择**保存**。

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

## 配置方法以使用 Lambda 授权方（AWS CLI）
<a name="configure-api-gateway-lambda-authorization-method-cli"></a>

配置 Lambda 授权方后，必须将其附加到 API 方法。您可以创建新方法或使用补丁操作将授权方附加到现有方法。如果授权方使用授权缓存，请务必更新策略以控制其它方法的访问权限。

以下 [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) 命令创建使用 Lambda 授权方的新方法：

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

以下 [update-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-method.html) 命令更新现有方法以使用 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"
```