Improve generic typing

This commit is contained in:
François Voron
2021-09-14 11:53:43 +02:00
parent 90aee2d487
commit fdc8e54253
15 changed files with 60 additions and 61 deletions

View File

@@ -5,11 +5,11 @@ from typing import Optional, Sequence
from fastapi import Depends, HTTPException, status
from makefun import with_signature
from fastapi_users import models
from fastapi_users.authentication.base import BaseAuthentication # noqa: F401
from fastapi_users.authentication.cookie import CookieAuthentication # noqa: F401
from fastapi_users.authentication.jwt import JWTAuthentication # noqa: F401
from fastapi_users.manager import UserManager, UserManagerDependency
from fastapi_users.models import BaseUserDB
INVALID_CHARS_PATTERN = re.compile(r"[^0-9a-zA-Z_]")
INVALID_LEADING_CHARS_PATTERN = re.compile(r"^[^a-zA-Z_]+")
@@ -43,7 +43,7 @@ class Authenticator:
def __init__(
self,
backends: Sequence[BaseAuthentication],
get_user_manager: UserManagerDependency,
get_user_manager: UserManagerDependency[models.UD],
):
self.backends = backends
self.get_user_manager = get_user_manager
@@ -108,14 +108,14 @@ class Authenticator:
async def _authenticate(
self,
*args,
user_manager: UserManager,
user_manager: UserManager[models.UD],
optional: bool = False,
active: bool = False,
verified: bool = False,
superuser: bool = False,
**kwargs
) -> Optional[BaseUserDB]:
user: Optional[BaseUserDB] = None
) -> Optional[models.UD]:
user: Optional[models.UD] = None
for backend in self.backends:
token: str = kwargs[name_to_variable_name(backend.name)]
if token:

View File

@@ -3,8 +3,8 @@ from typing import Any, Generic, Optional, TypeVar
from fastapi import Response
from fastapi.security.base import SecurityBase
from fastapi_users import models
from fastapi_users.manager import UserManager
from fastapi_users.models import BaseUserDB
T = TypeVar("T")
@@ -28,12 +28,12 @@ class BaseAuthentication(Generic[T]):
self.logout = logout
async def __call__(
self, credentials: Optional[T], user_manager: UserManager
) -> Optional[BaseUserDB]:
self, credentials: Optional[T], user_manager: UserManager[models.UD]
) -> Optional[models.UD]:
raise NotImplementedError()
async def get_login_response(self, user: BaseUserDB, response: Response) -> Any:
async def get_login_response(self, user: models.UD, response: Response) -> Any:
raise NotImplementedError()
async def get_logout_response(self, user: BaseUserDB, response: Response) -> Any:
async def get_logout_response(self, user: models.UD, response: Response) -> Any:
raise NotImplementedError()

View File

@@ -5,10 +5,10 @@ from fastapi import Response
from fastapi.security import APIKeyCookie
from pydantic import UUID4
from fastapi_users import models
from fastapi_users.authentication import BaseAuthentication
from fastapi_users.jwt import SecretType, decode_jwt, generate_jwt
from fastapi_users.manager import UserManager, UserNotExists
from fastapi_users.models import BaseUserDB
class CookieAuthentication(BaseAuthentication[str]):
@@ -67,8 +67,8 @@ class CookieAuthentication(BaseAuthentication[str]):
async def __call__(
self,
credentials: Optional[str],
user_manager: UserManager,
) -> Optional[BaseUserDB]:
user_manager: UserManager[models.UD],
) -> Optional[models.UD]:
if credentials is None:
return None
@@ -88,7 +88,7 @@ class CookieAuthentication(BaseAuthentication[str]):
except UserNotExists:
return None
async def get_login_response(self, user: BaseUserDB, response: Response) -> Any:
async def get_login_response(self, user: models.UD, response: Response) -> Any:
token = await self._generate_token(user)
response.set_cookie(
self.cookie_name,
@@ -105,11 +105,11 @@ class CookieAuthentication(BaseAuthentication[str]):
# so that FastAPI can terminate it properly
return None
async def get_logout_response(self, user: BaseUserDB, response: Response) -> Any:
async def get_logout_response(self, user: models.UD, response: Response) -> Any:
response.delete_cookie(
self.cookie_name, path=self.cookie_path, domain=self.cookie_domain
)
async def _generate_token(self, user: BaseUserDB) -> str:
async def _generate_token(self, user: models.UD) -> str:
data = {"user_id": str(user.id), "aud": self.token_audience}
return generate_jwt(data, self.secret, self.lifetime_seconds)

View File

@@ -5,10 +5,10 @@ from fastapi import Response
from fastapi.security import OAuth2PasswordBearer
from pydantic import UUID4
from fastapi_users import models
from fastapi_users.authentication.base import BaseAuthentication
from fastapi_users.jwt import SecretType, decode_jwt, generate_jwt
from fastapi_users.manager import UserManager, UserNotExists
from fastapi_users.models import BaseUserDB
class JWTAuthentication(BaseAuthentication[str]):
@@ -44,8 +44,8 @@ class JWTAuthentication(BaseAuthentication[str]):
async def __call__(
self,
credentials: Optional[str],
user_manager: UserManager,
) -> Optional[BaseUserDB]:
user_manager: UserManager[models.UD],
) -> Optional[models.UD]:
if credentials is None:
return None
@@ -65,10 +65,10 @@ class JWTAuthentication(BaseAuthentication[str]):
except UserNotExists:
return None
async def get_login_response(self, user: BaseUserDB, response: Response) -> Any:
async def get_login_response(self, user: models.UD, response: Response) -> Any:
token = await self._generate_token(user)
return {"access_token": token, "token_type": "bearer"}
async def _generate_token(self, user: BaseUserDB) -> str:
async def _generate_token(self, user: models.UD) -> str:
data = {"user_id": str(user.id), "aud": self.token_audience}
return generate_jwt(data, self.secret, self.lifetime_seconds)