普通に使うとエラーレスポンスが固定になる
API Gateway カスタム認証 (Custom Authorizers) において、トークンが不正な場合は context.fail("Unauthorized")
のようにエラーを返すのが一般的だろう。公式ドキュメントの例でもそうなっている。
しかし、その方法だとエラーレスポンスが「401 Unauthorized」に固定化されてしまう。提供したいAPIの要件によっては、任意のステータスコードやレスポンスボディを使いたいことがある。
この問題はAWSのフォーラムでも話題になっている。下記は一例。
このやりとりを見ると将来的には改善されそうだが、時期はわからない。
カスタマイズする方法
ただし現状でも、下記のように実装すればカスタマイズ可能である。
- Custom Authorizer のレスポンスは常に認証OKとする。かわりに実際の認証結果をレスポンスの context に含める(参考:Amazon API Gateway カスタム認証からの出力)。ここでは例として context.validToken に含めることにする
- 統合リクエストで $context.authorizer.validToken の値をマッピングする(参考:$context 変数へのアクセス)
- バックエンドはマッピングされた値を参照し、認証結果に応じたレスポンスを返す
- 統合レスポンスで、3の内容に応じた任意のステータスコードやレスポンスボディをマッピングする
この方法を採用すべきかどうかは状況による。ただ、選択肢のひとつとして知っておいて損はない。