aiteamutils 0.2.21__tar.gz → 0.2.23__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiteamutils
3
- Version: 0.2.21
3
+ Version: 0.2.23
4
4
  Summary: AI Team Utilities
5
5
  Project-URL: Homepage, https://github.com/yourusername/aiteamutils
6
6
  Project-URL: Issues, https://github.com/yourusername/aiteamutils/issues
@@ -4,7 +4,7 @@ from fastapi.security import OAuth2PasswordBearer
4
4
  from jose import JWTError, jwt
5
5
  from sqlalchemy.ext.asyncio import AsyncSession
6
6
 
7
- from .database import DatabaseService, get_database_service
7
+ from .database import DatabaseService, get_database_service, get_db
8
8
  from .exceptions import CustomException, ErrorCode
9
9
  from .config import get_settings
10
10
 
@@ -268,24 +268,24 @@ async def create_jwt_token(
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
- TokenCreationError: 토큰 생성 실패 시
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)}",
@@ -297,12 +297,28 @@ async def create_jwt_token(
297
297
  if token_type == "access":
298
298
  expires_at = datetime.now(UTC) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
299
299
  token_data = {
300
+ # 등록 클레임
300
301
  "iss": settings.TOKEN_ISSUER,
301
302
  "sub": user_data["username"],
302
303
  "aud": settings.TOKEN_AUDIENCE,
303
304
  "exp": expires_at,
305
+
306
+ # 공개 클레임
307
+ "username": user_data["username"],
308
+ "name": user_data.get("name"),
309
+
310
+ # 비공개 클레임
311
+ "user_ulid": user_data["ulid"],
312
+ "role_ulid": user_data.get("role_ulid"),
313
+ "status": user_data.get("status"),
314
+ "last_login": datetime.now(UTC).isoformat(),
304
315
  "token_type": token_type,
305
- **user_data
316
+
317
+ # 조직 관련 클레임
318
+ "organization_ulid": user_data.get("organization_ulid"),
319
+ "organization_id": user_data.get("organization_id"),
320
+ "organization_name": user_data.get("organization_name"),
321
+ "company_name": user_data.get("company_name")
306
322
  }
307
323
  else: # refresh token
308
324
  expires_at = datetime.now(UTC) + timedelta(days=14)
@@ -0,0 +1,2 @@
1
+ """버전 정보"""
2
+ __version__ = "0.2.23"
@@ -0,0 +1,57 @@
1
+ async def login(self, username: str, password: str, request: Request = None) -> Dict[str, str]:
2
+ """사용자 로그인을 처리합니다.
3
+
4
+ Args:
5
+ username (str): 사용자명
6
+ password (str): 비밀번호
7
+ request (Request, optional): FastAPI 요청 객체
8
+
9
+ Returns:
10
+ Dict[str, str]: 액세스 토큰과 리프레시 토큰
11
+
12
+ Raises:
13
+ CustomException: 인증 실패 시 예외
14
+ """
15
+ # 사용자 조회
16
+ user = await self.repository.get_user(username, by="username")
17
+ if not user:
18
+ raise CustomException(
19
+ ErrorCode.INVALID_CREDENTIALS,
20
+ source_function="AuthService.login"
21
+ )
22
+
23
+ # 비밀번호 검증
24
+ if not verify_password(password, user.password):
25
+ raise CustomException(
26
+ ErrorCode.INVALID_CREDENTIALS,
27
+ source_function="AuthService.login"
28
+ )
29
+
30
+ # 토큰 생성
31
+ user_data = {
32
+ "username": user.username,
33
+ "ulid": user.ulid,
34
+ "email": user.email
35
+ }
36
+
37
+ access_token = await create_jwt_token(
38
+ user_data=user_data,
39
+ token_type="access",
40
+ db_service=self.db_service,
41
+ log_model=self.log_model,
42
+ request=request
43
+ )
44
+
45
+ refresh_token = await create_jwt_token(
46
+ user_data=user_data,
47
+ token_type="refresh",
48
+ db_service=self.db_service,
49
+ log_model=self.log_model,
50
+ request=request
51
+ )
52
+
53
+ return {
54
+ "access_token": access_token,
55
+ "refresh_token": refresh_token,
56
+ "token_type": "bearer"
57
+ }
@@ -1,2 +0,0 @@
1
- """버전 정보"""
2
- __version__ = "0.2.21"
File without changes
File without changes
File without changes