feat: OAuth 2.0 백엔드 시스템 구현 완료

Phase 1 & 2 완료:
- 프로젝트 기본 구조 설정
- Docker Compose 환경 구성 (MongoDB, Redis, Backend, Frontend)
- FastAPI 기반 OAuth 2.0 백엔드 구현

주요 기능:
- JWT 기반 인증 시스템
- 3단계 권한 체계 (System Admin/Group Admin/User)
- 사용자 관리 CRUD API
- 애플리케이션 관리 CRUD API
- OAuth 2.0 Authorization Code Flow
- Refresh Token 관리
- 인증 히스토리 추적

API 엔드포인트:
- /auth/* - 인증 관련 (register, login, logout, refresh)
- /users/* - 사용자 관리
- /applications/* - 애플리케이션 관리
- /oauth/* - OAuth 2.0 플로우

보안 기능:
- bcrypt 비밀번호 해싱
- JWT 토큰 인증
- CORS 설정
- Rate limiting 준비

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
jungwoo choi
2025-09-05 14:56:02 +09:00
parent abdcc31245
commit 6c21809a24
25 changed files with 2012 additions and 45 deletions

View File

@ -0,0 +1,62 @@
"""Configuration settings for OAuth backend"""
from typing import List, Optional
from pydantic_settings import BaseSettings
from pydantic import Field
import json
class Settings(BaseSettings):
# Application
environment: str = Field(default="dev", env="ENVIRONMENT")
api_prefix: str = Field(default="/api/v1", env="API_PREFIX")
secret_key: str = Field(..., env="SECRET_KEY")
# MongoDB
mongodb_url: str = Field(..., env="MONGODB_URL")
database_name: str = Field(default="oauth_db", env="DATABASE_NAME")
# Redis
redis_url: str = Field(..., env="REDIS_URL")
redis_db: int = Field(default=0, env="REDIS_DB")
# JWT
jwt_algorithm: str = Field(default="HS256", env="JWT_ALGORITHM")
jwt_access_token_expire_minutes: int = Field(default=30, env="JWT_ACCESS_TOKEN_EXPIRE_MINUTES")
jwt_refresh_token_expire_days: int = Field(default=7, env="JWT_REFRESH_TOKEN_EXPIRE_DAYS")
# CORS
cors_origins: List[str] = Field(default=["http://localhost:5173"], env="CORS_ORIGINS")
cors_allow_credentials: bool = Field(default=True, env="CORS_ALLOW_CREDENTIALS")
# Rate Limiting
rate_limit_requests: int = Field(default=100, env="RATE_LIMIT_REQUESTS")
rate_limit_period: int = Field(default=60, env="RATE_LIMIT_PERIOD")
# Logging
log_level: str = Field(default="INFO", env="LOG_LEVEL")
log_path: str = Field(default="/var/log/oauth", env="LOG_PATH")
# Admin
admin_email: Optional[str] = Field(default="admin@oauth.local", env="ADMIN_EMAIL")
admin_password: Optional[str] = Field(default="admin123", env="ADMIN_PASSWORD")
# Session
session_secret_key: str = Field(default="session-secret-key", env="SESSION_SECRET_KEY")
session_cookie_name: str = Field(default="oauth_session", env="SESSION_COOKIE_NAME")
session_expire_minutes: int = Field(default=1440, env="SESSION_EXPIRE_MINUTES")
class Config:
env_file = ".env"
env_file_encoding = "utf-8"
case_sensitive = False
@classmethod
def parse_env_var(cls, field_name: str, raw_val: str):
if field_name == "cors_origins":
return json.loads(raw_val) if isinstance(raw_val, str) else raw_val
return raw_val
# Create settings instance
settings = Settings()