実現したいこと
- API gatewayでユーザーログイン認証ではなく、マシン間 (machine to machine:M2M) 認証を行いたい。
- 接続元クライアントごとに利用できるAPIを制御したい
APIキーと使用量プランは認証には使えない
API Gatewayには、APIキーと使用量プランという機能があり、APIキーをもつクライアントのみがアクセス可能なAPIを作成でき、APIリクエストのスロットリングができます。
しかし、公式docにもある通り認証認可には別の方法を考える必要があります。
API キーを、API へのアクセスを制御するための認証または承認に使用しないでください。
Amazon Cognito の Client Credentials Grant を利用する方法
公式doc上にて、API gatewayでのアクセス制御方法として、IAMロールとポリシー、Lambda オーソライザー、Amazon Cognito ユーザープールなどが記載されています。
Amazon Cognito ユーザープールというとユーザーログイン認証に利用するイメージが強いですが、Cognitoを認可サーバとして利用して、M2M認証を行う(OAuth2.0のClient Credentials Grantを利用)方法があります。
仕組み
Amazon Cognito ユーザープール (OAuth 2.0 Client credentials grant) と Amazon API Gateway (Cognito Authorizer) を利用して実装するサンプルコードが aws-samples で公開されています。
- クライアントID、クライアントシークレットのペアを用いて、トークンを発行
- APIアクセス with トークン
- Cognito Authorizer でトークンを検証
- Lambda funcrion へのリクエストを許可
図中に記載の Custom Scopes を利用して、Cognito に登録したアプリケーションクライアント(接続元のシステムごと)にAPIのリソース・パスごとに認可の制御ができます。
実現イメージ
- Amazon Cognitoのリソースサーバにてカスタムスコープを発行し、アプリケーションクライアントに紐づけることができる
- アプリケーションクライアントは紐づけられたカスタムスコープにのみアクセスが許可される
- Amazon API gateway の Cognito オーソライザーでリソース/パスごとに許可するスコープを指定できる
参考
Client Credentials Grant を利用したやってみた記事がありましたので、参考として貼っておきます。