やりたいこと
API GatewayをAPI Keyで認証かけた時に、認証されたAPI Keyの値をLambda側で扱いたい。
Lambdaにくる値のイメージ
API Gateway Proxyで実装するとこんな値がきます。
{
"httpMethod": "DELETE",
"headers": {
"Accept": "*/*",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "JP",
"x-api-key": "XXXXXX",
},
問題点
x-api-key
に表記揺れが発生するケースがあります。
X-API-KEY=XXX
だとheaders.X-API-KEY: XXX
。
X-API-key=XXX
だとheaders.X-API-key: XXX
。
対応
とりあえずheadersのキーに対してArray.findをかけて、比較する際に大文字 or 小文字に寄せることに。
import { APIGatewayProxyEvent } from 'aws-lambda'
const getAPIKey = (event: APIGatewayProxyEvent): string => {
const key = Object.keys(event.headers).find(header => {
return header.toLocaleLowerCase() === "x-api-key"
})
return event.headers[key] || ''
}