from motor.motor_asyncio import AsyncIOMotorClient from beanie import init_beanie import os from models import OAuthApplication, AuthorizationCode, AccessToken, OAuthScope, UserConsent async def init_db(): client = AsyncIOMotorClient(os.getenv("MONGODB_URL", "mongodb://mongodb:27017")) database = client[os.getenv("OAUTH_DB_NAME", "oauth_db")] await init_beanie( database=database, document_models=[ OAuthApplication, AuthorizationCode, AccessToken, OAuthScope, UserConsent ] ) # 기본 스코프 생성 await create_default_scopes() async def create_default_scopes(): """기본 OAuth 스코프 생성""" default_scopes = [ # 기본 인증 스코프 { "name": "openid", "display_name": "OpenID Connect", "description": "기본 사용자 인증 정보", "is_default": True, "requires_approval": False }, { "name": "profile", "display_name": "프로필 정보", "description": "이름, 프로필 이미지, 기본 정보 접근", "is_default": True, "requires_approval": True }, { "name": "email", "display_name": "이메일 주소", "description": "이메일 주소 및 인증 상태 확인", "is_default": False, "requires_approval": True }, { "name": "picture", "display_name": "프로필 사진", "description": "프로필 사진 및 썸네일 접근", "is_default": False, "requires_approval": True }, # 사용자 데이터 접근 스코프 { "name": "user:read", "display_name": "사용자 정보 읽기", "description": "사용자 프로필 및 설정 읽기", "is_default": False, "requires_approval": True }, { "name": "user:write", "display_name": "사용자 정보 수정", "description": "사용자 프로필 및 설정 수정", "is_default": False, "requires_approval": True }, # 애플리케이션 관리 스코프 { "name": "app:read", "display_name": "애플리케이션 정보 읽기", "description": "OAuth 애플리케이션 정보 조회", "is_default": False, "requires_approval": True }, { "name": "app:write", "display_name": "애플리케이션 관리", "description": "OAuth 애플리케이션 생성 및 수정", "is_default": False, "requires_approval": True }, # 조직/팀 관련 스코프 { "name": "org:read", "display_name": "조직 정보 읽기", "description": "소속 조직 및 팀 정보 조회", "is_default": False, "requires_approval": True }, { "name": "org:write", "display_name": "조직 관리", "description": "조직 설정 및 멤버 관리", "is_default": False, "requires_approval": True }, # API 접근 스코프 { "name": "api:read", "display_name": "API 데이터 읽기", "description": "API를 통한 데이터 조회", "is_default": False, "requires_approval": True }, { "name": "api:write", "display_name": "API 데이터 쓰기", "description": "API를 통한 데이터 생성/수정/삭제", "is_default": False, "requires_approval": True }, # 특수 스코프 { "name": "offline_access", "display_name": "오프라인 액세스", "description": "리프레시 토큰 발급 (장기 액세스)", "is_default": False, "requires_approval": True }, { "name": "admin", "display_name": "관리자 권한", "description": "전체 시스템 관리 권한", "is_default": False, "requires_approval": True } ] for scope_data in default_scopes: existing = await OAuthScope.find_one(OAuthScope.name == scope_data["name"]) if not existing: scope = OAuthScope(**scope_data) await scope.create()