- 公開日
- 最終更新日
【API Gateway】Cognitoオーソライザーを使ったM2M認証でAPIを保護する
この記事を共有する
目次
はじめに
こんにちは!パーソル&サーバーワークスの三宅です。
今回は、Amazon Cognito(以下、Cognito)とAmazon API Gateway(以下、API Gateway)を使って、Machine-to-Machine(以下、M2M)認証を実装してみます。
M2M認証とは、人間のユーザーを介さずに、アプリケーションやサービス同士が直接通信する際の認証方式です。 通常のユーザー認証(ログイン画面でIDとパスワードを入力するような認証)とは異なり、バックグラウンドで動作するサービス同士が自動的に認証を行います。
M2M認証は、OAuth 2.0のClient Credentialsフローを使用し、クライアントID とクライアントシークレットを使ってアクセストークンを取得し、そのトークンでAPIにアクセスする仕組みです。 CognitoとAPI Gatewayを組み合わせることで、このClient Credentialsフローを簡単に実装できるため、今回はAWS CLIを用いた方法をご紹介します。
事前準備
本記事では、Cognito認証の実装にフォーカスするため、以下のAPI Gatewayリソースはあらかじめ作成済みとします。
API Gatewayの設定
- REST API名: api-demo
- リソース: /test
- メソッド:
- GET /test → Mockインテグレーション、レスポンス:
{"status": "successful read"}(読み取り用) - POST /test → Mockインテグレーション、レスポンス:
{"status": "successful write"}(書き込み用)
- GET /test → Mockインテグレーション、レスポンス:
- デプロイステージ: v1
Cognitoの設定
ユーザープールの作成
まず、認証の基盤となるユーザープールを作成します。
USERPOOL_ID=$(aws cognito-idp create-user-pool \
--pool-name M2M-Pool \
--query 'UserPool.Id' --output text)
ユーザープールドメインの作成
次に、トークンエンドポイントへアクセスするためのドメインを作成します。
aws cognito-idp create-user-pool-domain \
--domain m2m-demo-$(date +%s) \
--user-pool-id $USERPOOL_ID
リソースサーバーとスコープの定義
続いて、API Gatewayで保護するリソースに対応するスコープを定義します。
今回は、読み取り用(read)と書き込み用(write)の2種類のスコープを設定します。
aws cognito-idp create-resource-server \
--user-pool-id $USERPOOL_ID \
--identifier api \
--name API \
--scopes ScopeName=read,ScopeDescription=Read ScopeName=write,ScopeDescription=Write
リソースサーバーの識別子としてapiを指定し、各スコープにはapi/read、api/writeという形式でアクセスできるようになります。
アプリクライアントの作成
最後に、Client Credentialsフローを使用するアプリクライアントを作成します。
generate-secretオプションでクライアントシークレットを生成し、allowed-o-auth-flowsにclient_credentialsを指定することで、M2M認証に必要な設定を行います。
aws cognito-idp create-user-pool-client \
--user-pool-id $USERPOOL_ID \
--client-name M2M-Client \
--generate-secret \
--allowed-o-auth-flows client_credentials \
--allowed-o-auth-scopes "api/read" "api/write" \
--allowed-o-auth-flows-user-pool-client
API Gatewayのオーソライザー設定
Cognitioオーソライザーの作成
作成済みのREST APIに対してCognitoオーソライザーを追加します。
タイプにはCOGNITO_USER_POOLSを指定し、先ほど作成したユーザープールのARNを設定します。
また、認証トークンはAuthorizationヘッダーから取得するよう設定します。
まず、API IDを取得します。
API_ID=$(aws apigateway get-rest-apis \
--query "items[?name=='api-demo'].id" --output text)
次に、Cognitoオーソライザーを作成します。
AUTHORIZER_ID=$(aws apigateway create-authorizer \
--rest-api-id $API_ID \
--name CognitoAuthorizer \
--type COGNITO_USER_POOLS \
--provider-arns arn:aws:cognito-idp:ap-northeast-1:$(aws sts get-caller-identity --query Account --output text):userpool/$USERPOOL_ID \
--identity-source method.request.header.Authorization \
--query 'id' --output text)
メソッドへのオーソライザー適用
GETメソッドとPOSTメソッドにオーソライザーを適用し、それぞれ適切なスコープを設定します。
まず、リソースIDを取得します。
RESOURCE_ID=$(aws apigateway get-resources \
--rest-api-id $API_ID \
--query "items[?path=='/test'].id" --output text)
GETメソッドにはapi/readスコープを要求するよう設定します。
aws apigateway update-method \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method GET \
--patch-operations \
op=replace,path=/authorizationType,value=COGNITO_USER_POOLS \
op=replace,path=/authorizerId,value=$AUTHORIZER_ID \
op=add,path=/authorizationScopes,value=api/read
POSTメソッドにはapi/writeスコープを要求するよう設定します。
aws apigateway update-method \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method POST \
--patch-operations \
op=replace,path=/authorizationType,value=COGNITO_USER_POOLS \
op=replace,path=/authorizerId,value=$AUTHORIZER_ID \
op=add,path=/authorizationScopes,value=api/write
API Gatewayのデプロイ
変更を反映するため、APIを再デプロイします。
aws apigateway create-deployment \
--rest-api-id $API_ID \
--stage-name v1
動作確認
ここまでの設定が完了したら、Postmanを使ってAPIの動作を確認します。
今回は、Cognitoのクライアント認証情報を使ってアクセストークンを取得し、そのトークンでAPI Gatewayのエンドポイントにアクセスします。
POSTMANのAuthorizationタブで以下のように設定します。
- Auth Type: OAuth 2.0
- Grant Type: Client Credentials
- Access Token URL: https://\
/oauth2/token - Client ID: Cognitoで作成したクライアントID
- Client Secret: Cognitoで作成したクライアントシークレット
- Scope: api/read または api/write
- Client Authentication: Send as Basic Auth header
GETメソッドの確認
API GatewayのエンドポイントをGETで呼び出します。

POSTメソッドの確認
API GatewayのエンドポイントをPOSTで呼び出します。

まとめ
今回は、CognitoユーザープールとAPI Gatewayを連携させてM2M認証を実装しました。 手を動かしながら、OAuth 2.0のClient Credentialsフローの仕組みを理解を深めることができたのは良かったです。 Cognitoを用いることで簡単にAPIを保護できるのでぜひ参考になれば幸いです。
この記事は私が書きました
三宅 啓右
記事一覧2025 Japan All AWS Certifications Engineers 猫派でしたが最近犬派になりました。