diff --git a/solution/api/v1/auth.py b/solution/api/v1/auth.py index 1e08c86..a425910 100644 --- a/solution/api/v1/auth.py +++ b/solution/api/v1/auth.py @@ -1,10 +1,39 @@ +import uuid + +import jwt +from django.conf import settings from django.http import HttpRequest from ninja.security import HttpBearer +from pydantic import BaseModel, ValidationError + +import apps.business.models -class BearerAuth(HttpBearer): +class BusinessToken(BaseModel): + business_id: uuid.UUID + token_version: int + + +class BusinessAuth(HttpBearer): def authenticate(self, request: HttpRequest, token: str) -> str | None: - if token == "will implement later": - return token + try: + decoded_payload = jwt.decode( + token, + settings.SECRET_KEY, + algorithms=["HS256"], + ) + token_payload = BusinessToken(**decoded_payload) + except (jwt.PyJWTError, ValidationError): + return None - return None + try: + business = apps.business.models.Business.objects.get( + id=token_payload.business_id + ) + except apps.business.models.Business.DoesNotExist: + return None + + if business.token_version != token_payload.token_version: + return None + + return business