Django + AWS Cognitoでユーザー認証を実装【Django×AWS入門9】

はじめに

Djangoアプリケーションでユーザー認証を実装する際、AWSのCognitoを利用すると、安全でスケーラブルな認証機能を簡単に導入できます。本記事では、AWS CognitoとDjangoを統合し、ユーザー認証を実装する手順を詳しく解説します。

AWS Cognitoとは?

AWS Cognitoの特徴

AWS Cognitoは、AWSが提供する認証・認可サービスであり、以下の機能を提供します。

  • ユーザープールとIDプールの管理
  • MFA(多要素認証)対応
  • OAuth 2.0、OpenID Connect、SAML対応
  • AWSサービスとの統合が容易
  • スケーラブルでセキュアな認証基盤

AWS Cognitoのセットアップ

1. ユーザープールの作成

  1. AWSマネジメントコンソールにログイン
  2. Cognitoサービスを開く
  3. 「ユーザープールを作成」ボタンをクリック
  4. 「手動でカスタマイズ」を選択し、プール名を入力
  5. ユーザーサインイン方法を設定(メール、電話番号、ユーザー名など)
  6. パスワードポリシーやMFAを設定
  7. アプリクライアントを作成し、クライアントIDとシークレットを取得

2. Cognito認証情報の取得

  1. ユーザープールのIDをメモ
  2. アプリクライアントIDを取得
  3. リージョン情報を確認

Djangoの設定

1. 必要なパッケージのインストール

DjangoとAWS Cognitoを統合するためにboto3をインストールします。

pip install boto3 django-cognito-auth

2. settings.py の設定

Djangoの設定ファイルを編集し、Cognitoの情報を追加します。

AWS_COGNITO_USER_POOL_ID = 'your-user-pool-id'
AWS_COGNITO_CLIENT_ID = 'your-app-client-id'
AWS_COGNITO_REGION = 'us-east-1'  # 使用するリージョン
AWS_COGNITO_DOMAIN = 'your-cognito-domain'  # Cognitoのドメイン

3. 認証バックエンドの追加

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'django_cognito_auth.backends.CognitoBackend',
)

4. Cognito認証用のビューを作成

views.py にサインアップ処理を追加

import boto3
from django.http import JsonResponse
from django.conf import settings

def cognito_signup(request):
    client = boto3.client('cognito-idp', region_name=settings.AWS_COGNITO_REGION)
    response = client.sign_up(
        ClientId=settings.AWS_COGNITO_CLIENT_ID,
        Username=request.POST['email'],
        Password=request.POST['password'],
        UserAttributes=[
            {'Name': 'email', 'Value': request.POST['email']}
        ]
    )
    return JsonResponse(response)

5. ログイン処理を追加

def cognito_login(request):
    client = boto3.client('cognito-idp', region_name=settings.AWS_COGNITO_REGION)
    response = client.initiate_auth(
        ClientId=settings.AWS_COGNITO_CLIENT_ID,
        AuthFlow='USER_PASSWORD_AUTH',
        AuthParameters={
            'USERNAME': request.POST['email'],
            'PASSWORD': request.POST['password']
        }
    )
    return JsonResponse(response)

本番環境の最適化

1. カスタムドメインの設定

AWS Cognitoのデフォルトドメインではなく、カスタムドメインを設定することで、ブランドに適したログインURLを提供できます。

2. IAMポリシーの設定

Cognitoを安全に運用するため、IAMポリシーを適切に設定し、不要なアクセス権限を削除します。

3. Djangoのセッション管理

認証情報をDjangoのセッションとして管理し、ログアウト処理も追加します。

def cognito_logout(request):
    request.session.flush()
    return JsonResponse({'message': 'Logged out'})

まとめ

本記事では、AWS Cognitoを利用してDjangoアプリにユーザー認証を実装する方法を解説しました。

  1. AWS Cognitoのセットアップ(ユーザープール作成、アプリクライアント設定)
  2. Djangoの設定(boto3の導入、settings.pyの変更)
  3. 認証用のAPI(サインアップ、ログイン、ログアウト)の実装
  4. 本番環境での最適化(カスタムドメイン、IAMポリシー、セッション管理)

AWS Cognitoを利用することで、Djangoアプリに安全でスケーラブルな認証基盤を構築できます。