来自 API Gateway Lambda 授权方的输出 - Amazon API Gateway

来自 API Gateway Lambda 授权方的输出

Lambda 授权方函数的输出是类似于目录的对象,其中必须包含委托人标识符 (principalId) 以及包含策略语句列表的策略文档 (policyDocument)。输出还可以包含一个含键值对的 context 映射。如果 API 利用使用计划(apiKeySource 设置为 AUTHORIZER),则 Lambda 授权方函数必须返回使用计划的 API 密钥之一作为 usageIdentifierKey 属性值。

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

{   "principalId": "yyyyyyyy", // The principal user identification associated with the token sent by the client. "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 策略的语句参考

对于已启用授权的方法 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 值。如果您想要将该值传递到后端,这会非常有用。有关更多信息,请参阅 适用于数据模型、授权方、映射模板和 CloudWatch 访问日志记录的 $context 变量

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

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

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

{api-key} 表示 API 阶段的使用计划中的 API 键。有关更多信息,请参阅 API Gateway 中针对 REST API 的使用计划和 API 密钥

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

{ "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/" } ] } }