add forgot login
This commit is contained in:
@@ -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}'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user