-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproviders.py
More file actions
63 lines (48 loc) · 1.95 KB
/
Copy pathproviders.py
File metadata and controls
63 lines (48 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from abc import ABC, abstractmethod
from jose import JWTError
from starlette.requests import Request
from src.modules.api_key.application.service import ApiKeyService
from src.core.security.jwt import JWTService
from src.core.security.token_revocation import TokenRevocationService
from src.shared.exceptions.credential_exception import InvalidCredentialsError
class AuthenticationProvider(ABC):
provider_name: str = ""
@abstractmethod
async def authenticate(self, token: str, request: Request) -> dict | None:
...
class JWTAuthProvider(AuthenticationProvider):
provider_name = "jwt"
async def authenticate(self, token: str, request: Request) -> dict | None:
try:
payload = JWTService.decode_token(token)
JWTService.require_token_type(payload, JWTService.ACCESS_TOKEN_TYPE)
if await TokenRevocationService.is_access_token_revoked(token):
return None
user_id = payload.get("sub")
if not user_id:
return None
request.state.token_payload = payload
return {
"user_id": user_id,
"provider": self.provider_name,
"payload": payload,
}
except (JWTError, InvalidCredentialsError, ValueError):
return None
class ApiKeyAuthProvider(AuthenticationProvider):
provider_name = "api_key"
def __init__(self, api_key_service: ApiKeyService):
self._api_key_service = api_key_service
async def authenticate(self, token: str, request: Request) -> dict | None:
api_key = await self._api_key_service.validate(token)
if api_key is None:
return None
return {
"user_id": str(api_key.id),
"provider": self.provider_name,
"payload": {
"sub": str(api_key.id),
"name": api_key.name,
"permissions": api_key.permissions,
},
}