ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【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"} (書き込み用)
  • デプロイステージ: 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で呼び出します。

スクリーンショット 2025-10-21 220554.png

POSTメソッドの確認

API GatewayのエンドポイントをPOSTで呼び出します。

スクリーンショット 2025-10-21 220342.png

まとめ

今回は、CognitoユーザープールとAPI Gatewayを連携させてM2M認証を実装しました。 手を動かしながら、OAuth 2.0のClient Credentialsフローの仕組みを理解を深めることができたのは良かったです。 Cognitoを用いることで簡単にAPIを保護できるのでぜひ参考になれば幸いです。

この記事は私が書きました

三宅 啓右

記事一覧

2025 Japan All AWS Certifications Engineers 猫派でしたが最近犬派になりました。

三宅 啓右

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。