使用授权者在 Amazon API Gateway 上的 URL 中使用 API 密钥

问题描述 投票:0回答:1

我使用代理集成创建了一个 AWS Gateway API,并使用 API 密钥部署在舞台上。我知道 API 密钥需要通过标头传递。我通过在标头上传递我的测试密钥之一来测试对我的 API 的请求,这工作正常(如果 API 密钥正确,则请求通过,否则它会按预期/想要失败)。

我想测试支持在 API URL 字符串和 AWS 文档中传递 API 密钥,这是通过自定义授权者支持的。

我创建了一个 lambda 授权者函数:

export const handler = (event, context, callback) => { callback(null, { principalId: "x-api-key", usageIdentifierKey: event.queryStringParameters["x-api-key"], policyDocument: { Version: "2012-10-17", Statement: [{ Action: "execute-api:Invoke", Effect: "Allow", Resource: "arn:aws:execute-api:us-east-1:xxxxxx:yyyyy/*/*/*/*" }] } }); }; 

我返回到 AWS Gateway API 并启用了一个授权者来执行上述 lambda,对于身份源,我选择“查询字符串”,其中“x-api-key”作为 lambda 授权者期望的参数。

当我通过curl 尝试我的API 时: 卷曲 -v https://xxxxxx.execute-api.us-east-1.amazonaws.com/test/yyy/zzz/A/B/C.mvt?x-api-key="Cmk20gz3rd8Mt9PSnA6gXXXXXXXXXYYYYYZZZZ"

我收到一条{"message":"Forbidden"}。

我查看了 CloudWatch 来尝试调试这个问题。我看到授权者 lambda 已被执行:

Using valid authorizer policy for principal: *****-key... Successfully completed authorizer execution ...

但是当点击 API 密钥计划验证时: `正在验证请求的使用计划:zzzzzzzzzzzz。 API 密钥:API 阶段:fyhxxxx/test”

请注意上面的消息中“API Key:”前面的文本是空白的。

此操作失败,并出现没有 API 密钥的错误:

API Key  not authorized because method 'GET /BBBB/{proxy+}' requires API Key and API Key is not associated with a Usage Plan for API Stage xxxx/test: API Key was required but not present

API 密钥似乎未传播到 AWS Gateway API 以根据计划进行验证....

我一定错过了一些东西

这是我的 API 资源设置,以防万一这有助于阐明这一点:

感谢您提供如何解决此问题的指示

amazon-web-services aws-api-gateway lambda-authorizer
1个回答
0
投票

我遇到了同样的问题,并且能够解决它。

以下是发生的情况以及导致该情况发生的操作:

  1. 我有一个使用 Lambda 授权者的有效 API 网关实现。
  2. 我合并导入了“补丁”OpenAPI 规范。
  3. 配置完所有内容并在测试阶段进行测试后,我部署了生产阶段。
  4. 所有请求均失败并出现上述错误消息。

这是我修复它的方法:

  1. 在 API 网关中,转到您的 API,然后转到 API 设置
  2. “API 密钥源”设置为“标头”
  3. 将“API密钥来源”设置为“授权者”

我怀疑导入 OpenAPI 规范导致该设置从“Authorizer”更改为“Header”。一旦我把值改回来,一切就开始按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.