2026年1月30日金曜日

new_Go_Typescript_blog_project01、ログイン機能、ユーザー登録機能実装

ログイン機能やユーザー登録機能はどの様に実装すれば、良いのですか?

8:55

ログイン・ユーザー登録機能の実装方法を、フロントエンド・バックエンドの両面から詳しく解説しますね!

🏗️ 全体アーキテクチャ

┌─────────────────┐     JWT Token      ┌──────────────────┐
│   Frontend      │ ◄────────────────► │    Backend       │
│  (Next.js)      │                    │    (Go/Gin)      │
│                 │                    │                  │
│ ・登録フォーム   │                    │ ・パスワード暗号化 │
│ ・ログインフォーム│                    │ ・JWT発行        │
│ ・認証状態管理   │                    │ ・トークン検証    │
└─────────────────┘                    └────────┬─────────┘
                                               │
                                        ┌──────▼─────────┐
                                        │   PostgreSQL   │
                                        │   users table  │
                                        └────────────────┘

📦 必要なパッケージ

バックエンド (Go)

bash
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)

bash
cd frontend
npm install axios js-cookie
npm install --save-dev @types/js-cookie

🔧 バックエンド実装

ステップを非表示
バックエンドのユーザーモデルを作成
user.go
JWT認証のユーティリティを作成
jwt.go
認証ミドルウェアを作成
auth.go
認証ハンドラー(登録・ログイン)を作成
auth.go
バックエンドのルーティング設定を作成
main.go

🎨 フロントエンド実装

ステップを非表示
認証コンテキスト(状態管理)を作成
AuthContext.tsx
ログインフォームコンポーネントを作成
LoginForm.tsx
ユーザー登録フォームコンポーネントを作成
RegisterForm.tsx
認証が必要なページを保護するHOCを作成
withAuth.tsx
_app.tsxでAuthProviderをセットアップ
_app.tsx
ログインページの実装例
login.tsx
ユーザー登録ページの実装例
register.tsx
ダッシュボードページの実装例(認証が必要)
dashboard.tsx
環境変数の設定例ファイルを作成
.env.example
フロントエンド環境変数の設定例ファイルを作成
.env.example

それでは、すべてのファイルをまとめて提供します!

ステップを非表示
Presented file(s)
バックエンドとフロントエンドのファイルを出力ディレクトリにコピー

bash

cd /home/claude && cp -r backend frontend /mnt/user-data/outputs/

出力

終了コード 0
出力ディレクトリの確認

plaintext

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
実装ガイドと使い方のドキュメントを作成
AUTHENTICATION_GUIDE.md

完成しました!🎉

📦 提供した実装ファイル

バックエンド(Go)

  1. models/user.go - ユーザーモデル(パスワード自動ハッシュ化)
  2. utils/jwt.go - JWT生成・検証ロジック
  3. middleware/auth.go - 認証ミドルウェア(3種類)
  4. handlers/auth.go - 登録・ログイン・ユーザー情報取得
  5. main.go - サーバー起動とルーティング
  6. .env.example - 環境変数テンプレート

フロントエンド(Next.js + TypeScript)

  1. contexts/AuthContext.tsx - 認証状態のグローバル管理
  2. components/LoginForm.tsx - ログインフォーム
  3. components/RegisterForm.tsx - ユーザー登録フォーム
  4. hoc/withAuth.tsx - ページ保護用HOC
  5. pages/_app.tsx - Providerセットアップ
  6. pages/login.tsx - ログインページ
  7. pages/register.tsx - 登録ページ
  8. pages/dashboard.tsx - 認証が必要なページ例
  9. .env.example - 環境変数テンプレート

ドキュメント

  • AUTHENTICATION_GUIDE.md - 詳細な実装ガイド

🌟 実装の特徴

セキュリティ面

✅ bcryptでパスワードハッシュ化(コスト10) ✅ JWTでステートレス認証 ✅ CORS設定済み ✅ バリデーション(メール形式、パスワード強度) ✅ 重複チェック(メール・ユーザー名)

UX面

✅ パスワード強度インジケーター ✅ リアルタイムバリデーション ✅ ローディング状態表示 ✅ エラーメッセージ(日本語) ✅ レスポンシブデザイン(Tailwind CSS)

DX面(開発者体験)

✅ TypeScript完全対応 ✅ カスタムフック(useAuth)で簡単利用 ✅ HOCで簡単にページ保護 ✅ Axiosインターセプターで自動トークン付与 ✅ 環境変数でAPI URL管理


🚀 次のステップ

プロジェクトに統合する手順:

bash
# 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

何か追加で実装したい機能や、カスタマイズしたい箇所があればお気軽にどうぞ!

パスワード変更の為のシステムは?

9:12

パスワード変更機能を実装しますね!通常のパスワード変更と、パスワードを忘れた場合のリセット機能の両方を作成します。

ステップを非表示
パスワード変更・リセット用のハンドラーを作成
password.go
Userモデルにパスワードリセット用のフィールドを追加
user_updated.go
バックエンドのルーティングにパスワード変更関連を追加
main_updated.go
パスワード変更フォームコンポーネント(ログイン中)
ChangePasswordForm.tsx
パスワードを忘れた場合のフォーム
ForgotPasswordForm.tsx
パスワードリセット実行フォーム
ResetPasswordForm.tsx
メール送信用のユーティリティ(実装例)
email.go
パスワード変更機能の完全ガイドを作成
PASSWORD_MANAGEMENT_GUIDE.md
作成したファイルの確認

パスワード関連ファイルを出力ディレクトリにコピー

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)

  1. handlers/password.go - パスワード変更・リセットロジック
    • ChangePassword - ログイン中のパスワード変更
    • ForgotPassword - リセットメール送信
    • ResetPassword - パスワードリセット実行
    • VerifyResetToken - トークン検証
  2. utils/email.go - メール送信ユーティリティ
    • Gmail/SendGrid/AWS SES対応
    • HTMLメールテンプレート
    • パスワードリセットメール
  3. models/user_updated.go - 拡張Userモデル
    • ResetPasswordToken - リセットトークン(ハッシュ化)
    • ResetPasswordExpires - 有効期限
    • PasswordChangedAt - 変更日時
  4. main_updated.go - ルーティング追加
    • /api/password/change - パスワード変更
    • /api/password/forgot - リセットリクエスト
    • /api/password/reset - リセット実行
    • /api/password/verify-token - トークン検証

フロントエンド(Next.js + TypeScript)

  1. ChangePasswordForm.tsx - パスワード変更フォーム
    • 現在のパスワード検証
    • パスワード強度インジケーター
    • リアルタイムバリデーション
  2. ForgotPasswordForm.tsx - パスワード忘れフォーム
    • メールアドレス入力
    • 開発環境でリセットURL表示
    • 注意事項表示
  3. ResetPasswordForm.tsx - リセット実行フォーム
    • トークン自動検証
    • パスワード強度チェック
    • 成功後に自動リダイレクト

ドキュメント

  • PASSWORD_MANAGEMENT_GUIDE.md - 完全実装ガイド

🌟 主な機能

セキュリティ機能

✅ トークンのハッシュ化 - DB保存時にbcryptでハッシュ化 ✅ 有効期限設定 - リセットリンクは1時間のみ有効 ✅ ワンタイム使用 - トークンは1回のみ使用可能 ✅ ユーザー存在チェックの隠蔽 - メールアドレス列挙攻撃対策 ✅ パスワード強度チェック - 8文字以上、英数字必須

UX機能

✅ パスワード強度インジケーター - リアルタイム表示 ✅ リアルタイムバリデーション - 入力中にエラー表示 ✅ 開発環境用デバッグ - リセットURLを画面表示 ✅ レスポンシブデザイン - モバイル対応

メール機能

✅ HTMLメール - 美しいデザインテンプレート ✅ 複数SMTP対応 - Gmail/SendGrid/AWS SES ✅ 自動リトライ - 送信失敗時の処理


🚀 使い方

1. ログイン中のパスワード変更

ダッシュボード → 設定 → パスワード変更
↓
現在のパスワード入力
↓
新しいパスワード入力(強度チェック)
↓
変更完了

2. パスワードを忘れた場合

ログイン画面 → パスワードを忘れた場合
↓
メールアドレス入力
↓
メール受信(リセットリンク)
↓
リンククリック → トークン検証
↓
新しいパスワード設定
↓
ログイン画面へリダイレクト

📧 メール設定例

Gmail(開発・テスト用)

env
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=ブログアプリ

アプリパスワード生成手順:

  1. Googleアカウント設定
  2. セキュリティ → 2段階認証を有効化
  3. アプリパスワード生成
  4. 生成された16桁のパスワードをコピー

SendGrid(本番推奨)

env
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USERNAME=apikey
SMTP_PASSWORD=SG.xxxxxxxxxxxx
FROM_EMAIL=noreply@yourdomain.com
FROM_NAME=ブログアプリ

🧪 テスト方法

bash
# 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. レート制限 - 1時間に3回までリセット可能
  2. 通知メール - パスワード変更時に通知
  3. 二段階認証 - TOTP(Google Authenticator)
  4. パスワード履歴 - 過去5回分を保存
  5. セキュリティ質問 - リセット時の追加認証

セキュリティ強化

go
// レート制限の実装例
func RateLimitMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        email := c.PostForm("email")
        // Redisでカウント管理
        // 1時間に3回まで許可
    }
}

何か追加で実装したい機能や、カスタマイズしたい箇所があればお気軽にどうぞ!

0 件のコメント: