我使用代理集成创建了一个 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 以根据计划进行验证....
我一定错过了一些东西
感谢您提供如何解决此问题的指示
我遇到了同样的问题,并且能够解决它。
以下是发生的情况以及导致该情况发生的操作:
这是我修复它的方法:
我怀疑导入 OpenAPI 规范导致该设置从“Authorizer”更改为“Header”。一旦我把值改回来,一切就开始按预期工作。