aiteamutils 0.2.21__tar.gz → 0.2.23__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -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