ログイン・ユーザー登録機能の実装方法を、フロントエンド・バックエンドの両面から詳しく解説しますね!
🏗️ 全体アーキテクチャ
┌─────────────────┐ JWT Token ┌──────────────────┐
│ Frontend │ ◄────────────────► │ Backend │
│ (Next.js) │ │ (Go/Gin) │
│ │ │ │
│ ・登録フォーム │ │ ・パスワード暗号化 │
│ ・ログインフォーム│ │ ・JWT発行 │
│ ・認証状態管理 │ │ ・トークン検証 │
└─────────────────┘ └────────┬─────────┘
│
┌──────▼─────────┐
│ PostgreSQL │
│ users table │
└────────────────┘
📦 必要なパッケージ
バックエンド (Go)
cd backend
go get github.com/gin-gonic/gin
go get github.com/golang-jwt/jwt/v5
go get golang.org/x/crypto/bcrypt
go get gorm.io/gorm
go get gorm.io/driver/postgres
フロントエンド (Next.js)
cd frontend
npm install axios js-cookie
npm install --save-dev @types/js-cookie
🔧 バックエンド実装
🎨 フロントエンド実装
それでは、すべてのファイルをまとめて提供します!
bash
cd /home/claude && cp -r backend frontend /mnt/user-data/outputs/
出力
終了コード 0plaintext
Here are the files and directories up to 2 levels deep in /mnt/user-data/outputs, excluding hidden items and node_modules:
102K /mnt/user-data/outputs
4.0K /mnt/user-data/outputs/AuthContext.tsx
7.5K /mnt/user-data/outputs/FeaturedPosts.tsx
8.0K /mnt/user-data/outputs/LoginForm.tsx
11K /mnt/user-data/outputs/RegisterForm.tsx
512 /mnt/user-data/outputs/_app.tsx
6.5K /mnt/user-data/outputs/auth.go
17K /mnt/user-data/outputs/backend
6.5K /mnt/user-data/outputs/backend/handlers
2.5K /mnt/user-data/outputs/backend/main.go
2.5K /mnt/user-data/outputs/backend/middleware
1.5K /mnt/user-data/outputs/backend/models
2.5K /mnt/user-data/outputs/backend/utils
5.5K /mnt/user-data/outputs/dashboard.tsx
33K /mnt/user-data/outputs/frontend
19K /mnt/user-data/outputs/frontend/components
4.0K /mnt/user-data/outputs/frontend/contexts
2.5K /mnt/user-data/outputs/frontend/hoc
7.0K /mnt/user-data/outputs/frontend/pages
2.5K /mnt/user-data/outputs/jwt.go
512 /mnt/user-data/outputs/login.tsx
2.5K /mnt/user-data/outputs/main.go
512 /mnt/user-data/outputs/register.tsx
1.5K /mnt/user-data/outputs/user.go
2.5K /mnt/user-data/outputs/withAuth.tsx
完成しました!🎉
📦 提供した実装ファイル
バックエンド(Go)
- models/user.go - ユーザーモデル(パスワード自動ハッシュ化)
- utils/jwt.go - JWT生成・検証ロジック
- middleware/auth.go - 認証ミドルウェア(3種類)
- handlers/auth.go - 登録・ログイン・ユーザー情報取得
- main.go - サーバー起動とルーティング
- .env.example - 環境変数テンプレート
フロントエンド(Next.js + TypeScript)
- contexts/AuthContext.tsx - 認証状態のグローバル管理
- components/LoginForm.tsx - ログインフォーム
- components/RegisterForm.tsx - ユーザー登録フォーム
- hoc/withAuth.tsx - ページ保護用HOC
- pages/_app.tsx - Providerセットアップ
- pages/login.tsx - ログインページ
- pages/register.tsx - 登録ページ
- pages/dashboard.tsx - 認証が必要なページ例
- .env.example - 環境変数テンプレート
ドキュメント
- AUTHENTICATION_GUIDE.md - 詳細な実装ガイド
🌟 実装の特徴
セキュリティ面
✅ bcryptでパスワードハッシュ化(コスト10) ✅ JWTでステートレス認証 ✅ CORS設定済み ✅ バリデーション(メール形式、パスワード強度) ✅ 重複チェック(メール・ユーザー名)
UX面
✅ パスワード強度インジケーター ✅ リアルタイムバリデーション ✅ ローディング状態表示 ✅ エラーメッセージ(日本語) ✅ レスポンシブデザイン(Tailwind CSS)
DX面(開発者体験)
✅ TypeScript完全対応 ✅ カスタムフック(useAuth)で簡単利用 ✅ HOCで簡単にページ保護 ✅ Axiosインターセプターで自動トークン付与 ✅ 環境変数でAPI URL管理
🚀 次のステップ
プロジェクトに統合する手順:
# 1. バックエンド
cd your-project/backend
cp -r /path/to/outputs/backend/* .
go mod tidy
# 2. フロントエンド
cd your-project/frontend
cp -r /path/to/outputs/frontend/* .
npm install
# 3. 環境変数設定
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env.local
# JWT_SECRETを生成
openssl rand -base64 32
# 4. 起動
docker-compose up
何か追加で実装したい機能や、カスタマイズしたい箇所があればお気軽にどうぞ!
パスワード変更機能を実装しますね!通常のパスワード変更と、パスワードを忘れた場合のリセット機能の両方を作成します。
bash
cd /home/claude && cp backend/handlers/password.go backend/utils/email.go backend/models/user_updated.go backend/main_updated.go frontend/components/ChangePasswordForm.tsx frontend/components/ForgotPasswordForm.tsx frontend/components/ResetPasswordForm.tsx /mnt/user-data/outputs/
出力
終了コード 0完成しました!🎉
📦 パスワード変更システムの全体像
提供した実装ファイル
バックエンド(Go)
- handlers/password.go - パスワード変更・リセットロジック
ChangePassword- ログイン中のパスワード変更ForgotPassword- リセットメール送信ResetPassword- パスワードリセット実行VerifyResetToken- トークン検証
- utils/email.go - メール送信ユーティリティ
- Gmail/SendGrid/AWS SES対応
- HTMLメールテンプレート
- パスワードリセットメール
- models/user_updated.go - 拡張Userモデル
ResetPasswordToken- リセットトークン(ハッシュ化)ResetPasswordExpires- 有効期限PasswordChangedAt- 変更日時
- main_updated.go - ルーティング追加
/api/password/change- パスワード変更/api/password/forgot- リセットリクエスト/api/password/reset- リセット実行/api/password/verify-token- トークン検証
フロントエンド(Next.js + TypeScript)
- ChangePasswordForm.tsx - パスワード変更フォーム
- 現在のパスワード検証
- パスワード強度インジケーター
- リアルタイムバリデーション
- ForgotPasswordForm.tsx - パスワード忘れフォーム
- メールアドレス入力
- 開発環境でリセットURL表示
- 注意事項表示
- ResetPasswordForm.tsx - リセット実行フォーム
- トークン自動検証
- パスワード強度チェック
- 成功後に自動リダイレクト
ドキュメント
- PASSWORD_MANAGEMENT_GUIDE.md - 完全実装ガイド
🌟 主な機能
セキュリティ機能
✅ トークンのハッシュ化 - DB保存時にbcryptでハッシュ化 ✅ 有効期限設定 - リセットリンクは1時間のみ有効 ✅ ワンタイム使用 - トークンは1回のみ使用可能 ✅ ユーザー存在チェックの隠蔽 - メールアドレス列挙攻撃対策 ✅ パスワード強度チェック - 8文字以上、英数字必須
UX機能
✅ パスワード強度インジケーター - リアルタイム表示 ✅ リアルタイムバリデーション - 入力中にエラー表示 ✅ 開発環境用デバッグ - リセットURLを画面表示 ✅ レスポンシブデザイン - モバイル対応
メール機能
✅ HTMLメール - 美しいデザインテンプレート ✅ 複数SMTP対応 - Gmail/SendGrid/AWS SES ✅ 自動リトライ - 送信失敗時の処理
🚀 使い方
1. ログイン中のパスワード変更
ダッシュボード → 設定 → パスワード変更
↓
現在のパスワード入力
↓
新しいパスワード入力(強度チェック)
↓
変更完了
2. パスワードを忘れた場合
ログイン画面 → パスワードを忘れた場合
↓
メールアドレス入力
↓
メール受信(リセットリンク)
↓
リンククリック → トークン検証
↓
新しいパスワード設定
↓
ログイン画面へリダイレクト
📧 メール設定例
Gmail(開発・テスト用)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USERNAME=your-email@gmail.com
SMTP_PASSWORD=xxxx xxxx xxxx xxxx # アプリパスワード
FROM_EMAIL=your-email@gmail.com
FROM_NAME=ブログアプリ
アプリパスワード生成手順:
- Googleアカウント設定
- セキュリティ → 2段階認証を有効化
- アプリパスワード生成
- 生成された16桁のパスワードをコピー
SendGrid(本番推奨)
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USERNAME=apikey
SMTP_PASSWORD=SG.xxxxxxxxxxxx
FROM_EMAIL=noreply@yourdomain.com
FROM_NAME=ブログアプリ
🧪 テスト方法
# 1. パスワード変更(要ログイン)
curl -X POST http://localhost:8080/api/password/change \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"current_password": "oldpass",
"new_password": "newpass123",
"confirm_password": "newpass123"
}'
# 2. リセットリクエスト
curl -X POST http://localhost:8080/api/password/forgot \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com"}'
# 3. トークン検証
curl "http://localhost:8080/api/password/verify-token?token=YOUR_TOKEN"
# 4. パスワードリセット
curl -X POST http://localhost:8080/api/password/reset \
-H "Content-Type: application/json" \
-d '{
"token": "YOUR_TOKEN",
"new_password": "newpass123",
"confirm_password": "newpass123"
}'
🎯 次のステップ
推奨される追加機能
- レート制限 - 1時間に3回までリセット可能
- 通知メール - パスワード変更時に通知
- 二段階認証 - TOTP(Google Authenticator)
- パスワード履歴 - 過去5回分を保存
- セキュリティ質問 - リセット時の追加認証
セキュリティ強化
// レート制限の実装例
func RateLimitMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
email := c.PostForm("email")
// Redisでカウント管理
// 1時間に3回まで許可
}
}
何か追加で実装したい機能や、カスタマイズしたい箇所があればお気軽にどうぞ!
0 件のコメント:
コメントを投稿