

# 在 API Gateway 中选择一个 API 密钥源
<a name="api-gateway-api-key-source"></a>

在将使用计划与 API 关联并在 API 方法上启用 API 密钥时，针对 API 的传入请求必须包含 [API 密钥](api-gateway-basic-concept.md#apigateway-definition-api-key)。API Gateway 将读取密钥并将它与使用计划中的密钥进行比较。如果匹配，API Gateway 将基于计划的请求限制和配额限制请求。否则，将引发 `InvalidKeyParameter` 异常。作为结果，调用方将收到 `403 Forbidden` 响应。

您的 API Gateway API 可从下面两个源之一接收 API 密钥：

**`HEADER`**  
您将 API 密钥分发给您的客户，并要求其将 API 密钥作为每个传入请求的 `X-API-Key` 标头传递。

**`AUTHORIZER`**  
您可以让 Lambda 授权方将 API 密钥作为授权响应的一部分返回。有关授权响应的更多信息，请参阅[来自 API Gateway Lambda 授权方的输出](api-gateway-lambda-authorizer-output.md)。

**注意**  
有关可考虑的最佳实践，请参阅 [API 密钥和使用计划的最佳实践](api-gateway-api-usage-plans.md#apigateway-usage-plans-best-practices)。

以下过程显示如何为 API 选择 API 密钥源。

------
#### [ AWS 管理控制台 ]

**为 API 选择 API 密钥源**

1. 登录 API Gateway 控制台。

1. 选择现有 API 或者创建新 API。

1. 在主导航窗格中，选择 **API 设置**。

1. 在 **API 详细信息**部分中，选择**编辑**。

1.  在 **API 密钥源**下，从下拉列表中选择 `Header` 或 `Authorizer`。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

使用以下 [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) 命令更新 API，将 API 密钥源设置为 `AUTHORIZER`：

```
aws apigateway update-rest-api --rest-api-id 1234123412 --patch-operations op=replace,path=/apiKeySource,value=AUTHORIZER
```

要让客户端提交 API 密钥，请在以上命令中将 `value` 设置为 `HEADER`。

------
#### [ REST API ]

要使用 API Gateway REST API 为 API 选择 API 密钥源，请按以下所示调用 [https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateRestApi.html](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateRestApi.html)：

```
PATCH /restapis/fugvjdxtri/ HTTP/1.1
Content-Type: application/json
Host: apigateway.us-east-1.amazonaws.com
X-Amz-Date: 20160603T205348Z
Authorization: AWS4-HMAC-SHA256 Credential={access_key_ID}/20160603/us-east-1/apigateway/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature={sig4_hash}

{
  "patchOperations" : [
    {
        "op" : "replace",
        "path" : "/apiKeySource",
        "value" : "HEADER"
    }
  ]
}
```

要让授权方返回 API 密钥，请在之前的 `value` 输入中将 `AUTHORIZER` 设置为 `patchOperations`。

------