Coverage for src / mysingle / auth / router / reset.py: 0%
23 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1from fastapi import APIRouter, Body, Request, status
2from pydantic import EmailStr
4from ..exceptions import (
5 UserInactive,
6 UserNotExists,
7)
8from ..user_manager import UserManager
10user_manager = UserManager()
13def get_reset_password_router() -> APIRouter:
14 """비밀번호 재설정을 위한 라우터 생성"""
15 router = APIRouter()
17 @router.post(
18 "/forgot-password",
19 status_code=status.HTTP_202_ACCEPTED,
20 )
21 async def forgot_password(
22 request: Request,
23 email: EmailStr = Body(..., embed=True),
24 ) -> None:
25 """
26 비밀번호 재설정 이메일을 요청합니다.
28 보안을 위해 이메일 존재 여부와 관계없이 항상 202 응답을 반환합니다.
29 """
30 try:
31 user = await user_manager.get_by_email(email)
32 except UserNotExists:
33 # 보안: 사용자 존재 여부를 노출하지 않음
34 return None
36 try:
37 await user_manager.forgot_password(user, request)
38 except UserInactive:
39 # 보안: 사용자 상태를 노출하지 않음
40 pass
42 return None
44 @router.post(
45 "/reset-password",
46 status_code=status.HTTP_204_NO_CONTENT,
47 )
48 async def reset_password(
49 request: Request,
50 token: str = Body(...),
51 password: str = Body(...),
52 ) -> None:
53 """
54 토큰을 사용하여 비밀번호를 재설정합니다.
55 """
56 # UserManager.reset_password에서 이미 적절한 예외를 발생시키므로
57 # 직접 전파하도록 수정
58 await user_manager.reset_password(token, password, request)
59 return None
61 return router