Contents
AWS Cognito ユーザー認証 実装方法:Next.js + Amplify UIでログイン機能を構築する手順
AWS Cognitoとユーザー認証の基礎知識
AWS Cognitoは、Webアプリケーションにおけるユーザー管理・認証の自動化を可能にするAWSサービスです。ユーザー登録やセッション管理といった煩雑な処理をAPIベースで簡略化し、開発時間を短縮できるのが特徴です。特にNext.jsとAmplify UIの組み合わせでは、UI設計の自由度と認証機能の統合が両立します。
Cognitoの役割とメリット
- セキュリティ強化: OAuth 2.0やSAMLをサポートし、多要素認証も可能
- スケーラビリティ: ユーザー数が増えてもクラウドインフラで負荷対応
- カスタマイズ性: ログインフローのカスタムチャレンジやUI変更が柔軟
ユーザー認証の基本フロー概要
- ユーザーがID/パスワードを入力 → 2. Cognitoで資格照合 → 3. 成功時トークン発行 → 4. アプリケーションへのアクセス許可
Cognitoユーザープールの作成手順
AWSコンソールでユーザー認証に必要な基盤となる「ユーザープール」を構築します。
ダッシュボードでの初期設定
- AWS Management Console から Cognitoサービスを開く
- 「ユーザープールを作成」ボタンをクリックし、プール名(例:
MyAppUserPool)を入力 - アプリケーションタイプ を「従来のウェブアプリケーション」に設定(localhost開発時は必須)
blockquote: ユーザープール作成時、メールアドレスでの登録は必須ではありませんが、セキュリティ向上のため推奨されます。
セキュリティ設定と属性管理
- パスワードポリシー: 「最小文字数」や「特殊文字使用」を強制する設定
- 認証属性: メールアドレス・電話番号など、ユーザー登録時の必須項目を指定
- チャレンジタイプ: 認証失敗時の再試行回数やMFA(多要素認証)の有効化
| 設定項目 | 値例 | 補足 |
|---|---|---|
| パスワード長 | 8文字以上 | 見やすさとセキュリティのバランス |
| MFA有効化 | オン | 高セキュリティ環境向け |
| 認証失敗回数 | 3回 | ブロック防止のため |
リダイレクトURL設定と注意点
- クライアントID/シークレット の生成時に、認証成功後のリダイレクトURLを
http://localhost:3000などに設定 - Next.js 13以降の互換性:
next.config.jsに記載されているWebpack設定は、最新バージョンでは不要な場合があります。公式ドキュメントで確認してください(AWS Amplify CLI Documentation)。
Next.jsプロジェクトへのAmplify導入
Next.jsアプリケーションにAWS Amplifyライブラリを統合し、Cognitoとの連携を行います。
Amplify CLIのインストールと初期化
- CLIインストール:
npm install -g @aws-amplify/cliを実行 - プロジェクト初期化:
amplify initを実行し、AWSアカウントを選択 - プロジェクトディレクトリに
. amplifyフォルダが生成される
Cognitoとの連携設定
amplify add authコマンドを実行 → Cognitoユーザープールの選択- カスタム属性(例:
preferred_username)を追加し、UI表示用に設定 amplify pushでリソースをAWSに反映
blockquote: Amplify CLIを使用する場合、Next.jsアプリケーションの
next.config.jsには以下を追記してください。ただし、Next.js 13以降では互換性に注意が必要です(公式記事参照)。
|
1 2 3 4 5 6 7 |
module.exports = { webpack(config) { config.resolve.alias['react'] = require.resolve('react'); return config; } }; |
Amplify UIによるログイン画面実装
Amplify UIコンポーネントを利用し、サインアップ/ログイン画面を素早く構築できます。
サインアップ/ログインコンポーネントの作成
npm install aws-amplify @aws-amplify/ui-reactを実行components/Auth.jsに以下コードを作成:
|
1 2 3 4 5 6 7 8 9 10 11 |
import { Authenticator } from '@aws-amplify/ui-react'; import '@aws-amplify/ui-react/styles.css'; export default function Auth() { return ( <Authenticator> {({ user }) => <div>{user?.username}</div>} </Authenticator> ); } |
pages/index.jsに<Auth />コンポーネントを呼び出し、UIが表示される
UIカスタマイズのポイント
- テーマ変更: CSSカスタマイズでボタン・フォーム色を調整可能
- コンポーネント分割: ログイン/サインアップの切り替えロジックを
useAuthenticator()で制御 - エラーメッセージ:
onError={(e) => console.error(e)}でカスタムメッセージ表示
カスタム認証フローの設計と実装
CognitoのチャレンジタイプやAWS SDKを用いて、セキュリティ強化を図ります。
チャレンジタイプの設定方法
- Cognitoユーザープールで「アカウント設定」→「パスワードポリシー」を開き、「認証失敗時のチャレンジ」を設定。選択肢として「パスワード再入力」「確認コード送信」などがあります。
AWS SDKによるカスタム検証ロジック
aws-sdkをインストール:npm install aws-sdk- 認証失敗時のカスタムチャレンジ処理(例: メール確認コード送信)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const AWS = require('aws-sdk'); const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(); async function sendCustomChallenge(email) { const params = { UserPoolId: process.env.NEXT_PUBLIC_USER_POOL_ID, Username: email }; try { await cognitoidentityserviceprovider.adminInitiateAuth(params).promise(); console.log('カスタムチャレンジ送信完了'); } catch (err) { console.error(err); } } |
blockquote: カスタム検証ロジックの実装には、AWS IAMの権限設定が必須です。
adminInitiateAuthはAdminInitiateAuthという特殊な権限が必要になります(AWS IAMポリシー参照)。
実装完了後の確認と注意点
認証フローの動作確認とセキュリティリスクへの対応を実施します。
テストケースの設計
- 正常系: 正しいID/パスワードでログイン → トークン発行確認
- 異常系1: 認証失敗時のチャレンジ処理テスト
- 異常系2: MFAコードを誤って入力した場合の挙動確認
セキュリティリスクへの対応
- アクセス制限: CognitoクライアントIDが外部に漏れないように環境変数で管理
- ログ監視: AWS CloudWatch Logsで認証失敗時の異常を監視
- データ暗号化: ユーザー属性の格納先(DynamoDBなど)はAES-256で暗号化
最新情報と参考リンク
- Amplify UIバージョン: 公式リポジトリ
- AWS Cognito公式ドキュメント: AWS Cognito Documentation
記事で解説したコードを活用してCognito認証機能の開発を始めてみましょう