API Gateway + LambdaでAPI Keyの値を取得する


やりたいこと

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] || ''
}