Contents
- 1 AWS Cognito カスタム認証 Lambdaトリガー OTP Flask によるセキュアな認証フロー構築ガイド
- 1.1 CUSTOM_AUTHフローのプロセスとLambdaトリガーの役割
- 1.2 Lambdaトリガーの種類と実行条件
- 1.3 AWSコンソールでのLambdaトリガー設定手順
- 1.4 IAMロールとLambda関数の権限設定
- 1.5 LambdaトリガーによるOTP発行処理の実装
- 1.6 OTP検証処理の実装とFlaskとの連携
- 1.7 Flaskアプリケーションとの連携構成
- 1.8 AWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装フロー
- 1.9 API Gatewayとの連携構成(オプション)
- 1.10 AWS Cognito カスタム認証 Lambdaトリガー OTP Flask のベストプラクティス
- 1.11 まとめと導入案
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask によるセキュアな認証フロー構築ガイド
AWS Cognitoのカスタム認証フローは、メール/パスワード以外の多要素認証(例:OTP)を導入する際の核となる技術です。特にLambdaトリガーと連携して「OTP発行→検証」の一連の処理を行うことで、Flaskアプリケーションとの連携が可能となります。本記事では、AWS Cognito カスタム認証 Lambdaトリガー OTP Flask に特化した実装手法を解説し、技術的詳細と実務でのベストプラクティスを提供します。
CUSTOM_AUTHフローのプロセスとLambdaトリガーの役割
CUSTOM_AUTHフローは、ユーザーが認証フローを開始するたびにカスタムチャレンジを発行し、Lambdaトリガー経由で処理を行う仕組みです。このフローでは、OTPの生成・検証やFlaskアプリケーションとの通信が必要になるため、Lambdaトリガーが中心的な役割を果たします。
以下にフロー全体の段階と各ステップにおけるLambdaトリガーの役割を整理しました:
| フロー段階 | 説明 | Lambdaトリガーの動作 |
|---|---|---|
| 初期化 | AdminInitiateAuthで認証フロー開始 |
トリガーなし(Cognito側での初期処理) |
| チャレンジ発行 | ユーザーにOTP送信を促すチャレンジを発行 | pre-authenticationトリガーでOTP生成・FlaskアプリケーションとのAPI通信実施 |
| ユーザー応答 | ユーザーがOTP入力後、認証フェーズへ進む | トリガーなし(Cognito側での処理) |
| 認証結果処理 | OTP検証処理を実施し、認証成否を判定 | post-authenticationトリガーでFlaskアプリケーションから保存されたOTPと照合 |
注意: Lambdaトリガーは「pre-authentication」でチャレンジ発行、「post-authentication」で検証処理を行う構造です。フロー全体において、トリガーの実行タイミングを誤ると認証フローが破綻します。
Lambdaトリガーの種類と実行条件
Lambdaトリガーは、Cognitoイベントに応じて自動的に呼び出され、以下のように動作します。特にAWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装では「pre-authentication」と「post-authentication」が必須です。
| トリガータイプ | 実行条件 | 主な用途 | AWS Cognito カスタム認証 Lambdaトリガー OTP Flask との関係性 |
|---|---|---|---|
| pre-sign-up | ユーザーがサインアップを開始した直後 | アカウント属性の検証など | 無関係(OTP発行には使わない) |
| pre-authentication | 認証フロー開始直前(CUSTOM_AUTH) | OTP発行処理やセキュリティチェック | 必須(OTP生成とFlask連携処理) |
| post-authentication | 認証成功後の処理 | ロール割り当てやセッション情報の更新 | 必須(OTP検証用) |
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask では、
pre-authenticationとpost-authenticationに注力する必要があります。
AWSコンソールでのLambdaトリガー設定手順
CognitoユーザープールにLambdaトリガーを追加するには、以下の手順でAWSコンソールから設定を行います。この際、Flaskアプリケーションとの連携に特化した処理が必要です。
- Cognito管理コンソールを開き、「ユーザープール」を選択。
- 「トリガー」タブから「Lambdaトリガーの設定」をクリック。
pre-authenticationとpost-authenticationにそれぞれ対応するLambda関数をアサイン。- 設定後、保存を押して反映します。
重要: フロー順序は「イベントの流れ」に沿って設定し、誤ったタイミングで動作させると意図せぬ挙動が発生する可能性があります。
IAMロールとLambda関数の権限設定
Lambdaトリガーを実行させるには、Cognitoユーザープールとの通信権限が必要です。以下のIAMポリシーを割り当てることで、AWS Cognito カスタム認証 Lambdaトリガー OTP Flask に特化した処理が可能になります。
必要なIAM権限:
cognito-idp:AdminRespondToAuthChallenge(OTP検証用)cognito-idp:GetUser(ユーザー情報取得用)
注意: FlaskアプリケーションとのAPI通信には、Lambda関数側で追加のセキュリティ設定(例:API Gatewayでの認証)が必要です。
LambdaトリガーによるOTP発行処理の実装
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask におけるOTP生成ロジックは、pre-authenticationトリガーで実施されます。以下にPythonベースのサンプルコードを示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import boto3 import random def lambda_handler(event, context): user_pool_id = event['userPoolId'] username = event['userName'] # OTPを生成(6桁) otp = str(random.randint(100000, 999999)) # FlaskアプリケーションにOTPを送信(例:POST API呼び出し) # requests.post("https://flask-sample.com/api/send-otp", json={"username": username, "otp": otp}) return { 'challengeName': 'CUSTOM_CHALLENGE', 'challengeResult': False, 'customChallengeResponses': {'OTP': otp} } |
重要: 実際にはFlaskアプリケーションと連携してメールやSMSでOTPを送信する処理が必要です。
OTP検証処理の実装とFlaskとの連携
認証フェーズでは、post-authenticationトリガーを使用してユーザーが入力したOTPを検証します。以下にPythonでのサンプルコードを示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def lambda_handler(event, context): username = event['userName'] provided_otp = event['custom:ProvidedOTP'] # Flaskアプリケーションから保存済みOTPを取得(例:DB経由) stored_otp = get_stored_otp(username) if provided_otp == stored_otp: return { 'challengeName': 'CUSTOM_CHALLENGE', 'challengeResult': True } else: return { 'challengeName': 'CUSTOM_CHALLENGE', 'challengeResult': False, 'error': 'Invalid OTP' } |
Flaskアプリケーションとの連携構成
Flaskアプリケーションは、AWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装において重要な役割を果たします。以下に簡単なAPIエンドポイントを示します。
Flask側のOTP送信処理
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from flask import Flask, request, jsonify app = Flask(__name__) otp_storage = {} @app.route('/api/send-otp', methods=['POST']) def send_otp(): data = request.json username = data.get('username') otp = str(random.randint(100000, 999999)) otp_storage[username] = otp return jsonify({'status': 'OK', 'message': f'OTP {otp}を送信しました'}) |
Flask側のOTP検証処理
|
1 2 3 4 5 6 7 8 9 10 11 |
@app.route('/api/validate-otp', methods=['POST']) def validate_otp(): data = request.json username = data.get('username') provided_otp = data.get('otp') stored_otp = otp_storage.get(username) if not stored_otp or stored_otp != provided_otp: return jsonify({'status': 'ERROR', 'message': '無効なOTP'}) return jsonify({'status': 'OK', 'message': '認証成功'}) |
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装フロー
以下は、AWS Cognito カスタム認証 Lambdaトリガー OTP Flask を用いた一連のフローです。
- ユーザーが
AdminInitiateAuthを呼ぶ pre-authenticationトリガーでLambdaがOTP生成し、Flaskアプリケーションに送信- FlaskアプリケーションがOTPを保存・メール/SMSで送信
- ユーザーがOTP入力後、
AdminRespondToAuthChallengeで認証フェーズへ進む post-authenticationトリガーでLambdaがFlaskアプリケーションから保存されたOTPと照合
通信形式: Flask側ではJSON形式でのやり取りが推奨されます。
API Gatewayとの連携構成(オプション)
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装に際して、FlaskアプリケーションとLambdaトリガーの間にAPI Gatewayを介するケースがあります。以下に設定手順を示します。
- AWS API Gatewayコンソールで新規REST APIを作成。
- 「プロキシリースポンス」を選択し、Lambdaトリガー関数をアタッチ。
- プロキシモードでは、API GatewayがLambdaに自動でイベントオブジェクトを整形して渡します。
補足: FlaskアプリケーションとLambdaトリガーの通信は、API Gateway経由でも可能です。
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask のベストプラクティス
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask において、以下の点に注意するとセキュリティと信頼性が向上します。
- セキュリティ: OTP有効期限を5分以内に設定し、再送信回数を制限
- パフォーマンス: Lambdaトリガー関数は10秒以内に実行する必要があるため、処理時間を厳密に管理
- ロギング: エラーやステータス情報をCloudWatch Logsに記録して監視
まとめと導入案
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask の実装では、以下のような構成が可能です。
pre-authenticationでOTP生成とFlaskアプリケーションへの通信post-authenticationでFlaskから保存されたOTPと照合
AWS Cognito カスタム認証 Lambdaトリガー OTP Flask は、セキュアな認証フロー構築に最適です。記事内で紹介したコード例や設定手順を参考に、自社環境での実装を試してみてください。