- 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>
142 lines
4.6 KiB
Python
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() |