aiteamutils 0.2.22__py3-none-any.whl → 0.2.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
    
        aiteamutils/security.py
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            """보안 관련 유틸리티."""
         
     | 
| 
       2 
2 
     | 
    
         
             
            from datetime import datetime, timedelta, UTC
         
     | 
| 
       3 
     | 
    
         
            -
            from typing import Dict, Any, Optional, Literal, Callable
         
     | 
| 
      
 3 
     | 
    
         
            +
            from typing import Dict, Any, Optional, Literal, Callable, Type, Base
         
     | 
| 
       4 
4 
     | 
    
         
             
            from fastapi import Request, HTTPException, status
         
     | 
| 
       5 
5 
     | 
    
         
             
            from functools import wraps
         
     | 
| 
       6 
6 
     | 
    
         
             
            from jose import jwt, JWTError
         
     | 
| 
         @@ -262,30 +262,30 @@ async def create_jwt_token( 
     | 
|
| 
       262 
262 
     | 
    
         
             
                user_data: Dict[str, Any],
         
     | 
| 
       263 
263 
     | 
    
         
             
                token_type: Literal["access", "refresh"],
         
     | 
| 
       264 
264 
     | 
    
         
             
                db_service: DatabaseService,
         
     | 
| 
       265 
     | 
    
         
            -
                log_model:  
     | 
| 
      
 265 
     | 
    
         
            +
                log_model: Type[Base],
         
     | 
| 
       266 
266 
     | 
    
         
             
                request: Optional[Request] = None
         
     | 
| 
       267 
267 
     | 
    
         
             
            ) -> str:
         
     | 
| 
       268 
268 
     | 
    
         
             
                """JWT 토큰을 생성하고 로그를 기록합니다.
         
     | 
| 
       269 
269 
     | 
    
         | 
| 
       270 
270 
     | 
    
         
             
                Args:
         
     | 
| 
       271 
     | 
    
         
            -
                    user_data: 사용자 데이터 (username, ulid 등 
     | 
| 
      
 271 
     | 
    
         
            +
                    user_data: 사용자 데이터 딕셔너리 (username, ulid, name, role_ulid, status, organization 정보 등)
         
     | 
| 
       272 
272 
     | 
    
         
             
                    token_type: 토큰 타입 ("access" 또는 "refresh")
         
     | 
| 
       273 
273 
     | 
    
         
             
                    db_service: 데이터베이스 서비스
         
     | 
| 
       274 
     | 
    
         
            -
                    log_model:  
     | 
| 
      
 274 
     | 
    
         
            +
                    log_model: 로그 모델 클래스
         
     | 
| 
       275 
275 
     | 
    
         
             
                    request: FastAPI 요청 객체
         
     | 
| 
       276 
276 
     | 
    
         | 
| 
       277 
277 
     | 
    
         
             
                Returns:
         
     | 
| 
       278 
278 
     | 
    
         
             
                    str: 생성된 JWT 토큰
         
     | 
| 
       279 
279 
     | 
    
         | 
| 
       280 
280 
     | 
    
         
             
                Raises:
         
     | 
| 
       281 
     | 
    
         
            -
                     
     | 
| 
       282 
     | 
    
         
            -
                    SecurityError: 기타 보안 관련 오류 발생 시
         
     | 
| 
      
 281 
     | 
    
         
            +
                    CustomException: 토큰 생성 실패 시
         
     | 
| 
       283 
282 
     | 
    
         
             
                """
         
     | 
| 
       284 
283 
     | 
    
         
             
                try:
         
     | 
| 
       285 
284 
     | 
    
         
             
                    settings = get_settings()
         
     | 
| 
      
 285 
     | 
    
         
            +
                    
         
     | 
| 
       286 
286 
     | 
    
         
             
                    # 필수 필드 검증
         
     | 
| 
       287 
287 
     | 
    
         
             
                    required_fields = {"username", "ulid"}
         
     | 
| 
       288 
     | 
    
         
            -
                    missing_fields = required_fields - user_data.keys()
         
     | 
| 
      
 288 
     | 
    
         
            +
                    missing_fields = required_fields - set(user_data.keys())
         
     | 
| 
       289 
289 
     | 
    
         
             
                    if missing_fields:
         
     | 
| 
       290 
290 
     | 
    
         
             
                        raise TokenCreationError(
         
     | 
| 
       291 
291 
     | 
    
         
             
                            detail=f"Missing required fields: {', '.join(missing_fields)}",
         
     | 
| 
         @@ -293,16 +293,31 @@ async def create_jwt_token( 
     | 
|
| 
       293 
293 
     | 
    
         
             
                            token_type=token_type
         
     | 
| 
       294 
294 
     | 
    
         
             
                        )
         
     | 
| 
       295 
295 
     | 
    
         | 
| 
       296 
     | 
    
         
            -
                    # 토큰 데이터 생성
         
     | 
| 
       297 
296 
     | 
    
         
             
                    if token_type == "access":
         
     | 
| 
       298 
297 
     | 
    
         
             
                        expires_at = datetime.now(UTC) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
         
     | 
| 
       299 
298 
     | 
    
         
             
                        token_data = {
         
     | 
| 
      
 299 
     | 
    
         
            +
                            # 등록 클레임
         
     | 
| 
       300 
300 
     | 
    
         
             
                            "iss": settings.TOKEN_ISSUER,
         
     | 
| 
       301 
301 
     | 
    
         
             
                            "sub": user_data["username"],
         
     | 
| 
       302 
302 
     | 
    
         
             
                            "aud": settings.TOKEN_AUDIENCE,
         
     | 
| 
       303 
303 
     | 
    
         
             
                            "exp": expires_at,
         
     | 
| 
      
 304 
     | 
    
         
            +
                            
         
     | 
| 
      
 305 
     | 
    
         
            +
                            # 공개 클레임
         
     | 
| 
      
 306 
     | 
    
         
            +
                            "username": user_data["username"],
         
     | 
| 
      
 307 
     | 
    
         
            +
                            "name": user_data.get("name"),
         
     | 
| 
      
 308 
     | 
    
         
            +
                            
         
     | 
| 
      
 309 
     | 
    
         
            +
                            # 비공개 클레임
         
     | 
| 
      
 310 
     | 
    
         
            +
                            "user_ulid": user_data["ulid"],
         
     | 
| 
      
 311 
     | 
    
         
            +
                            "role_ulid": user_data.get("role_ulid"),
         
     | 
| 
      
 312 
     | 
    
         
            +
                            "status": user_data.get("status"),
         
     | 
| 
      
 313 
     | 
    
         
            +
                            "last_login": datetime.now(UTC).isoformat(),
         
     | 
| 
       304 
314 
     | 
    
         
             
                            "token_type": token_type,
         
     | 
| 
       305 
     | 
    
         
            -
                             
     | 
| 
      
 315 
     | 
    
         
            +
                            
         
     | 
| 
      
 316 
     | 
    
         
            +
                            # 조직 관련 클레임
         
     | 
| 
      
 317 
     | 
    
         
            +
                            "organization_ulid": user_data.get("organization_ulid"),
         
     | 
| 
      
 318 
     | 
    
         
            +
                            "organization_id": user_data.get("organization_id"),
         
     | 
| 
      
 319 
     | 
    
         
            +
                            "organization_name": user_data.get("organization_name"),
         
     | 
| 
      
 320 
     | 
    
         
            +
                            "company_name": user_data.get("company_name")
         
     | 
| 
       306 
321 
     | 
    
         
             
                        }
         
     | 
| 
       307 
322 
     | 
    
         
             
                    else:  # refresh token
         
     | 
| 
       308 
323 
     | 
    
         
             
                        expires_at = datetime.now(UTC) + timedelta(days=14)
         
     | 
    
        aiteamutils/version.py
    CHANGED
    
    | 
         @@ -1,2 +1,2 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            """버전 정보"""
         
     | 
| 
       2 
     | 
    
         
            -
            __version__ = "0.2. 
     | 
| 
      
 2 
     | 
    
         
            +
            __version__ = "0.2.24" 
         
     | 
| 
         @@ -8,9 +8,9 @@ aiteamutils/database.py,sha256=raYKRZjEfefM3SnoPYozPu7OUGm62XWOUqZzN4_cayw,33479 
     | 
|
| 
       8 
8 
     | 
    
         
             
            aiteamutils/dependencies.py,sha256=e5P-DQi5OMMh7FADaAUqU0kLVBcReE7za55EDNZN950,4008
         
     | 
| 
       9 
9 
     | 
    
         
             
            aiteamutils/enums.py,sha256=ipZi6k_QD5-3QV7Yzv7bnL0MjDz-vqfO9I5L77biMKs,632
         
     | 
| 
       10 
10 
     | 
    
         
             
            aiteamutils/exceptions.py,sha256=YV-ISya4wQlHk4twvGo16I5r8h22-tXpn9wa-b3WwDM,15231
         
     | 
| 
       11 
     | 
    
         
            -
            aiteamutils/security.py,sha256= 
     | 
| 
      
 11 
     | 
    
         
            +
            aiteamutils/security.py,sha256=t1xdvfy2qpggiQGr89AMuRKvWK1UFMxJiJYAE5Lek7o,13453
         
     | 
| 
       12 
12 
     | 
    
         
             
            aiteamutils/validators.py,sha256=3N245cZFjgwtW_KzjESkizx5BBUDaJLbbxfNO4WOFZ0,7764
         
     | 
| 
       13 
     | 
    
         
            -
            aiteamutils/version.py,sha256= 
     | 
| 
       14 
     | 
    
         
            -
            aiteamutils-0.2. 
     | 
| 
       15 
     | 
    
         
            -
            aiteamutils-0.2. 
     | 
| 
       16 
     | 
    
         
            -
            aiteamutils-0.2. 
     | 
| 
      
 13 
     | 
    
         
            +
            aiteamutils/version.py,sha256=xu1IgfL2hhBUF2d91PMBax7rAUgopL3RxVIiQol7jAg,44
         
     | 
| 
      
 14 
     | 
    
         
            +
            aiteamutils-0.2.24.dist-info/METADATA,sha256=CX-Mx2vQIjg5tPPaKKMWfwEYZv9Q-4LuVK6AGuqayqs,1718
         
     | 
| 
      
 15 
     | 
    
         
            +
            aiteamutils-0.2.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
         
     | 
| 
      
 16 
     | 
    
         
            +
            aiteamutils-0.2.24.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     |