aiteamutils 0.2.22__tar.gz → 0.2.23__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/PKG-INFO +1 -1
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/security.py +22 -6
- aiteamutils-0.2.23/aiteamutils/version.py +2 -0
- aiteamutils-0.2.23/app/app/auth/service.py +57 -0
- aiteamutils-0.2.22/aiteamutils/version.py +0 -2
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/.gitignore +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/README.md +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/__init__.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/base_model.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/base_repository.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/base_service.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/cache.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/config.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/database.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/dependencies.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/enums.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/exceptions.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/aiteamutils/validators.py +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/pyproject.toml +0 -0
- {aiteamutils-0.2.22 → aiteamutils-0.2.23}/setup.py +0 -0
@@ -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
|
-
|
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
|
-
|
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,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
|
+
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|