add forgot login

This commit is contained in:
2025-12-05 10:23:22 -03:00
parent b929c492c0
commit 7c3239d856
14 changed files with 270 additions and 57 deletions

View File

@@ -3,10 +3,10 @@ from http import HTTPStatus
from typing import Annotated
from uuid import uuid4
from aws_lambda_powertools.event_handler import content_types
from aws_lambda_powertools.event_handler.api_gateway import Response, Router
from aws_lambda_powertools.event_handler.exceptions import NotFoundError
from aws_lambda_powertools.event_handler.openapi.params import Body
from aws_lambda_powertools.utilities.data_masking import DataMasking
from layercake.dateutils import now, ttl
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey
from layercake.extra_types import CpfStr
@@ -18,22 +18,17 @@ from config import USER_TABLE
router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
data_masker = DataMasking()
masking_rules = {
'email': {'regex_pattern': '(.)(.*)(..)(@.*)', 'mask_format': r'\1****\3\4'},
}
class UserNotFoundError(NotFoundError): ...
@router.post('/forgot')
@router.post('/forgot', compress=True)
def forgot(username: Annotated[EmailStr | CpfStr, Body(embed=True)]):
now_ = now()
user = _get_user(username)
reset_ttl = ttl(start_dt=now_, hours=3)
code = uuid4()
code = str(uuid4())
with dyn.transact_writer() as transact:
transact.update(
@@ -63,6 +58,7 @@ def forgot(username: Annotated[EmailStr | CpfStr, Body(embed=True)]):
'id': 'PASSWORD_RESET',
'sk': f'CODE#{code}',
'name': user.name,
'email': user.email,
'user_id': user.id,
'ttl': reset_ttl,
'created_at': now_,
@@ -70,13 +66,11 @@ def forgot(username: Annotated[EmailStr | CpfStr, Body(embed=True)]):
)
return Response(
content_type=content_types.APPLICATION_JSON,
status_code=HTTPStatus.CREATED,
body=data_masker.erase(
{
'email': user.email,
},
masking_rules=masking_rules,
),
body={
'email': mask_email(user.email),
},
)
@@ -114,3 +108,9 @@ def _get_user(username: str) -> User:
return User(
**pick(('id', 'name', 'email'), user),
)
def mask_email(email):
username, domain = email.split('@')
username = username[0] + '*' * (len(username) - 3) + username[-2:]
return f'{username}@{domain}'

View File

@@ -7,7 +7,6 @@ from aws_lambda_powertools.event_handler import content_types
from aws_lambda_powertools.event_handler.api_gateway import Response, Router
from aws_lambda_powertools.event_handler.exceptions import ServiceError
from aws_lambda_powertools.event_handler.openapi.params import Body
from aws_lambda_powertools.shared.cookies import Cookie
from layercake.dateutils import now, ttl
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from layercake.extra_types import CpfStr, NameStr