Files
site11/services/oauth/backend/database.py
jungwoo choi 1467766f3d Step 8: OAuth 2.0 인증 시스템 및 프로필 기능 구현
- OAuth 2.0 서비스 구현
  * Authorization Code, Client Credentials, Refresh Token 플로우 지원
  * 애플리케이션 등록 및 관리 기능
  * 토큰 introspection 및 revocation
  * SSO 설정 지원 (Google, GitHub, SAML)
  * 실용적인 스코프 시스템 (user, app, org, api 관리)

- 사용자 프로필 기능 확장
  * 프로필 사진 및 썸네일 필드 추가
  * bio, location, website 등 추가 프로필 정보
  * 이메일 인증 및 계정 활성화 상태 관리
  * UserPublicResponse 모델 추가

- OAuth 스코프 관리
  * picture 스코프 추가 (프로필 사진 접근 제어)
  * 카테고리별 스코프 정리 (기본 인증, 사용자 데이터, 앱 관리, 조직, API)
  * 스코프별 승인 필요 여부 설정

- 인프라 개선
  * Users 서비스 포트 매핑 추가 (8001)
  * OAuth 서비스 Docker 구성 (포트 8003)
  * Kafka 이벤트 통합 (USER_CREATED, USER_UPDATED, USER_DELETED)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 17:37:16 +09:00

142 lines
4.6 KiB
Python

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