我们决定使用标头来检查以确保所有流量都来自 API 网关。我们在我们的应用程序环境变量中保存一个秘密,并告诉 API 网关在我们创建 API 时注入它。然后在我们的应用程序中检查该密钥。
这是我们正在为此做的事情:
在我们的基本控制器中,我们检查密钥(我们只是在网关后面有一个 REST API):
string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];
if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
throw new error;
}
在我们的 swagger 文件中(我们使用 swagger.json 作为 API 的来源)
"x-amazon-apigateway-integration": {
"type": "http_proxy",
"uri": "https://${stageVariables.url}/path/to/resource",
"httpMethod": "post",
"requestParameters": {
"integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
}
},
在我们的 docker compose 文件中(我们使用的是 docker,但同样可以在任何设置文件中使用)
services:
example:
environment:
- ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d
在构建时,我们从设置文件中获取秘密并将其替换到 swagger.json 文件中。通过这种方式,我们可以在设置文件中轮换密钥,API 网关将更新以使用应用程序正在寻找的密钥。