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

View File

@@ -1,3 +1,4 @@
import json
from http import HTTPMethod
from layercake.dynamodb import DynamoDBPersistenceLayer, PartitionKey
@@ -20,7 +21,8 @@ def test_forgot(
),
lambda_context,
)
assert 's****io@somosbeta.com.br' == r['body']['email']
body = json.loads(r['body'])
assert 's***io@somosbeta.com.br' == body['email']
app.lambda_handler(
http_api_proxy(
@@ -34,4 +36,4 @@ def test_forgot(
forgot = dynamodb_persistence_layer.collection.query(
PartitionKey('PASSWORD_RESET'),
)
assert len(forgot['items']) == 3
assert len(forgot['items']) == 5