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