AWSでCognito認証付きAPIを構築する方法

AWS

はじめに

WebアプリやモバイルアプリのバックエンドとしてAPIを公開する際、「誰でもアクセスできてしまうのは困る」「認証されたユーザーだけに使わせたい」といったニーズはよくあります。
そこで活躍するのが、API GatewayとCognitoを組み合わせた認証付きAPIの構築です。

本記事では、AWS API Gatewayにユーザー認証を導入する方法を初心者向けにわかりやすく解説します。特に、CognitoというAWSの認証基盤を使って、認証されたユーザーだけがアクセスできるセキュアなAPIを作成する手順を中心に紹介します。

認証付きAPIの全体構成の概要

本記事で構築する認証付きAPIは、「API Gateway + Cognito + Lambda」の3つのサービスを連携させて実現します。以下にその全体像を簡単に紹介します。

全体構成のイメージ図

各サービスの役割

  • Cognito(コグニート)
    AWSが提供するユーザー管理・認証サービスです。ログインやサインアップを管理し、ユーザーにJWTトークン(IDトークンやアクセストークン)を発行します。
  • API Gateway
    外部からのリクエストを受け取る入口です。Cognitoオーソライザーを設定することで、トークンを検証し、認証済みのリクエストだけをLambdaへ流すことができます。
  • Lambda
    実際のAPI処理を行うサーバーレス関数です。たとえば「ユーザーの情報を取得する」「データベースに保存する」などの処理をここで実装します。

Cognito User Poolの作成

認証付きAPIを実現するには、まずユーザーの情報を管理する仕組み=Cognito User Pool(ユーザープール)を作成する必要があります。
ここでは、AWSマネジメントコンソールを使ってユーザープールを作成する手順を紹介します。

Cognitoの画面を開く

  1. AWSマネジメントコンソール にログイン
  2. 検索バーに「Cognito」と入力し、Cognitoのサービスページへ移動

新しいユーザープールを作成する

新しいユーザープールを作成

今回は、シングルページアプリケーション(SPA)で行なっていきます。

Screenshot

オプション設定下記画像のようにして、作成します。

Screenshot

ユーザー登録方法

ユーザーを手動作成方法

  • ユーザープールの「ユーザー」タブを選択
Screenshot
  • 「ユーザーを作成」ボタンを押す
Screenshot
  • 下記内容を設定します。
カテゴリ項目今回の選択肢備考
招待方法招待メッセージ招待を送信しない招待メッセージの送信方法を選択
ユーザー情報ユーザー名(必須)user-aサインインに使用される一意のID
Eメールアドレスusera@example.comサインイン・パスワードリセット等に使用
Eメールを検証済みにするチェックEメール確認ステップをスキップ可能
電話番号未入力任意(MFAや通知用途)
パスワード仮パスワードの設定方法手動入力仮パスワードの設定

確認ステータスの更新

ユーザーを作成したら下記表示になってます。

確認ステータスがパスワードを強制的に変更になっており、このままだとユーザーとして利用できないので変更していきます。

clooudshellを開きます。

Screenshot

下記コマンドを叩きます。
user-pool-id、username、passwordは自身の環境に置き換えてください。

aws cognito-idp admin-set-user-password \
  --user-pool-id ap-northeast-1_xxxxxx \
  --username user-a \
  --password password \
  --permanent

確認済みになれば成功です。

API Gatewayでオーソライザーの設定

Cognitoでユーザープールを作成したら、次はAPI Gatewayにその認証情報を連携させましょう。
ここでは、Cognito User Poolを使ったJWTオーソライザーの作成方法を解説します。

APIの作成

APIの作成方法~Lambda関数との接続方法は下記記事に掲載しています。

API Gateway×LambdaでREST API構築入門
API GatewayとAWS Lambdaを使ってサーバーレスなREST APIを構築する方法を初心者向けに丁寧に解説。デプロイと動作確認までカバー

オーソライザーの作成

  • 対象API「オーソライザー」メニューを開く
  • 「オーソライザーを作成」をクリック
  • 以下の情報を入力します
項目内容
オーソライザー名任意の名前(例:CognitoAuth
タイプCognito を選択
ユーザープール作成済みのCognito User Poolを選択
トークンのソースAuthorization

ALLOW_ADMIN_USER_PASSWORD_AUTHを有効化する

トークンをCLIで簡単に取得できるようにするために、ALLOW_ADMIN_USER_PASSWORD_AUTHを有効にします。

Cognitoのアプリケーションクライアント名をクリックし、アプリケーションクライアントにアクセスします。

Screenshot

編集をクリックする。

ALLOW_ADMIN_USER_PASSWORD_AUTHを有効化します。

Screenshot

メソッドにオーソライザーを適用する

  • API Gatewayの「リソース」設定へ進む
  • 任意のエンドポイント(例:GET /hello)を選択
  • メソッドリクエストの編集を選択
Screenshot
  • 認可で先ほどのオーソライザーを選択
  • 保存してデプロイ

認証付きAPIのテスト

Cognitoによるユーザー認証と、API Gatewayオーソライザー、Lambda関数の統合が完了したら、実際にAPIが正しく動作しているかをテストしてみましょう。

IDトークンの取得

Cognitoにログインしたユーザーが取得できる IDトークン(JWT) が必要です。

CloudShellから下記コマンドを叩いて取得します。

 aws cognito-idp admin-initiate-auth \
  --user-pool-id ap-northeast-1_xxxxxx \
  --client-id xxxxxxxxxxxxxxxxxx \
  --auth-flow "ADMIN_USER_PASSWORD_AUTH" \
  --auth-parameters USERNAME=user-a,PASSWORD=password

認証なしで呼び出してみる(失敗パターン)

curl https://your-api-id.execute-api.ap-northeast-1.amazonaws.com

結果:403 Forbidden

{
  "message":"Unauthorized"
}

これはトークンが指定されていないため、API Gatewayがアクセスを拒否したことを示しています。

認証ありで呼び出す(成功パターン)

ID_TOKENにIDトークンを指定します。

curl -X GET your-api-id.execute-api.ap-northeast-1.amazonaws.com \
  -H "Authorization: Bearer ID_TOKEN"

結果:200 OK

{
  "statusCode":200,
  "body":"\"Hello from Lambda!\""
}

参考リンク

コメント

タイトルとURLをコピーしました