

# 来自 API Gateway Lambda 授权方的输出
<a name="api-gateway-lambda-authorizer-output"></a>

Lambda 授权方函数的输出是类似于目录的对象，其中必须包含委托人标识符 (`principalId`) 以及包含策略语句列表的策略文档 (`policyDocument`)。输出还可以包含一个含键值对的 `context` 映射。如果 API 利用使用计划（[https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource) 设置为 `AUTHORIZER`），则 Lambda 授权方函数必须返回使用计划的 API 密钥之一作为 `usageIdentifierKey` 属性值。

下面显示了一个此类输出的示例。

------
#### [ JSON ]

****  

```
{
  "principalId": "yyyyyyyy", 
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"
}
```

------

 在此示例中，策略语句指定是允许还是拒绝 (`Effect`) API Gateway 执行服务调用 (`Action`) 指定的 API 方法 (`Resource`)。可能需要根据授权方来控制对多个资源的访问权限。您可以使用通配符 (`*`) 指定资源类型（方法）。有关针对 API 调用设置有效策略的信息，请参阅[在 API Gateway 中执行 API 的 IAM 策略的语句参考](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-calling-api-permissions)。

对于已启用授权的方法 ARN，例如 `arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]`，最大长度为 1600 字节。路径参数值（其大小在运行时确定）可能导致 ARN 长度超过限制。出现这种情况是时，API 客户端将收到 `414 Request URI too long` 响应。

此外，如授权方的策略声明中所示，资源 ARN 当前长度限制为 512 个字符。因此，您不能在请求 URI 中将 URI 与具有很大长度的 JWT 令牌一起使用。而是可以安全地在请求标头中传递 JWT 令牌。

 您可以使用 `$context.authorizer.principalId` 变量访问映射模板中的 `principalId` 值。如果您想要将该值传递到后端，这会非常有用。有关更多信息，请参阅 [数据转换的上下文变量](api-gateway-mapping-template-reference.md#context-variable-reference)。

 您可以通过分别调用 `$context.authorizer.stringKey`、`$context.authorizer.numberKey` 或 `$context.authorizer.booleanKey` 来访问映射模板中 `context` 映射的 `stringKey`、`numberKey` 或 `booleanKey` 值（如 `"value"`、`"1"` 或 `"true"`）。返回的值都是字符串化的。请注意，您不能在 `context` 映射中将 JSON 对象或数组设置为任何键的有效值。

 您可以使用 `context` 映射将缓存的凭证从授权方返回到后端（使用集成请求映射模板）。这使后端能够提供改善的用户体验，方式是使用缓存的凭证来减少为每个请求访问私有密钥并打开授权令牌的需要。

 对于 Lambda 代理集成，API Gateway 将 `context` 对象作为 `event` 输入的一部分从 Lambda 授权方直接传递到后端 Lambda 函数。您可以通过调用 `context`，在 Lambda 函数中检索 `$event.requestContext.authorizer.key` 键值对。

`{api-key}` 表示 API 阶段的使用计划中的 API 键。有关更多信息，请参阅 [API Gateway 中针对 REST API 的使用计划和 API 密钥](api-gateway-api-usage-plans.md)。

 下面显示了来自示例 Lambda 授权方的示例输出。此示例输出包含一个策略语句，用于阻止 (`Deny`) 在 `dev` 阶段调用AWS账户 (`123456789012`) API (`ymy8tbxw7b`) 的 `GET` 方法。

------
#### [ JSON ]

****  

```
{
  "principalId": "user",
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/dev/GET/"
      }
    ]
  }
}
```

------