From 25d45ded61f6620a449358666ebf0650a2e2e15d Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 28 Jul 2023 21:27:12 +0300 Subject: [PATCH 01/22] Fixture fix. --- auth_lib/testing/testutils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/auth_lib/testing/testutils.py b/auth_lib/testing/testutils.py index 78b7b8a..a9d2265 100644 --- a/auth_lib/testing/testutils.py +++ b/auth_lib/testing/testutils.py @@ -19,8 +19,7 @@ def auth_mock(request): for cnt, scope in enumerate(scopes): session_scopes.append({"id": cnt, "name": scope, "comment": ""}) _return_val: dict[str, int | list[dict[str, str | int]]] = { - "user_id": marker.kwargs.get("user_id", 0), - "id": 0, + "id": marker.kwargs.get("user_id", 0), "session_scopes": session_scopes, "user_scopes": session_scopes, } From 3cdebb4aa510aca11a2d9f620004ceab837261fd Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 18:09:03 +0300 Subject: [PATCH 02/22] Added userdata in user information --- auth_lib/aiomethods.py | 34 ++++++++++++++++++++++++++++------ auth_lib/fastapi.py | 38 ++++++++++++++++++++++++++++++++++---- auth_lib/methods.py | 30 ++++++++++++++++++++++++------ 3 files changed, 86 insertions(+), 16 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 26994b5..8e85c18 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -3,21 +3,22 @@ import aiohttp -from .exceptions import AuthFailed, SessionExpired +from .exceptions import AuthFailed, IncorrectData, NotFound, SessionExpired # See docs on https://api.test.profcomff.com/?urls.primaryName=auth class AsyncAuthLib: - url: str + auth_url: str + user_data_url: str def __init__(self, url: str): - self.url = url + self.auth_url = url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} async with aiohttp.ClientSession() as session: - response = await session.post(url=f"{self.url}/email/login", json=json) + response = await session.post(url=f"{self.auth_url}/email/login", json=json) match response.status: case 200: return await response.json() @@ -28,7 +29,7 @@ async def check_token(self, token: str) -> dict[str, Any] | None: headers = {"Authorization": token} async with aiohttp.request( "GET", - urljoin(self.url, "me"), + urljoin(self.auth_url, "me"), headers={"Authorization": token}, params={ "info": [ @@ -45,7 +46,9 @@ async def check_token(self, token: str) -> dict[str, Any] | None: async def logout(self, token: str) -> bool: headers = {"Authorization": token} async with aiohttp.ClientSession() as session: - response = await session.post(url=f"{self.url}/logout", headers=headers) + response = await session.post( + url=f"{self.auth_url}/logout", headers=headers + ) match response.status: case 200: @@ -54,3 +57,22 @@ async def logout(self, token: str) -> bool: raise AuthFailed(response=await response.json()) case 403: raise SessionExpired(response=await response.json()) + + async def get_user_data(self, token: str) -> dict[str | Any] | None: + headers = {"Authorization": token} + user_get = await self.check_token(token) + user_id = user_get["id"] + async with aiohttp.ClientSession() as session: + response = await session.get( + url=f"{self.user_data_url}/user/{user_id}", headers=headers + ) + match response.status: + case 200: + return await response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) + return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index d61cfad..dac76e9 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,8 +14,10 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" + USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False + ENABLE_USER_DATA: bool = False model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") @@ -29,23 +31,38 @@ def __init__( scopes: list[str] = [], auto_error: bool | None = None, allow_none: bool | None = None, + enable_user_data: bool | None = None, auth_url=None, # Для обратной совместимости + user_data_url=None, ) -> None: if auth_url is not None: warn( "auth_url in args deprecated, use AUTH_URL env instead", DeprecationWarning, ) + if user_data_url is not None: + warn( + "user_data_url in args deprecated, use USER_DATA_URL env instead", + DeprecationWarning, + ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" + self.user_data_url = user_data_url or self.settings.USER_DATA_URL + if not self.user_data_url.endswith("/"): + self.user_data_url = self.user_data_url + "/" self.auto_error = ( auto_error if auto_error is not None else self.settings.AUTH_AUTO_ERROR ) self.allow_none = ( allow_none if allow_none is not None else self.settings.AUTH_ALLOW_NONE ) + self.enable_user_data = ( + enable_user_data + if enable_user_data is not None + else self.settings.ENABLE_USER_DATA + ) self.scopes = scopes def _except(self): @@ -63,18 +80,31 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) + async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: + if not token and self.allow_none: + return None + if not token: + return self._except() + if self.enable_user_data: + return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) + return None + async def __call__( self, request: Request, ) -> dict[str, Any] | None: token = request.headers.get("Authorization") - user_session = await self._get_session(token) - if user_session is None: + result = await self._get_session(token) + if result is None: + return self._except() + user_data_info = await self._get_userdata(token) + if user_data_info is None: return self._except() + result["userdata"] = user_data_info session_scopes = set( - [scope["name"].lower() for scope in user_session["session_scopes"]] + [scope["name"].lower() for scope in result["session_scopes"]] ) required_scopes = set([scope.lower() for scope in self.scopes]) if required_scopes - session_scopes: self._except() - return user_session + return result diff --git a/auth_lib/methods.py b/auth_lib/methods.py index f9b9c02..cf7d730 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -3,20 +3,21 @@ import requests -from .exceptions import AuthFailed, SessionExpired +from .exceptions import AuthFailed, IncorrectData, NotFound, SessionExpired # See docs on https://api.test.profcomff.com/?urls.primaryName=auth class AuthLib: - url: str + auth_url: str + user_data_url: str def __init__(self, url: str): - self.url = url + self.auth_url = url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} - response = requests.post(url=f"{self.url}/email/login", json=json) + response = requests.post(url=f"{self.auth_url}/email/login", json=json) match response.status_code: case 200: return response.json() @@ -26,7 +27,7 @@ def email_login(self, email: str, password: str) -> dict[str, Any]: def check_token(self, token: str) -> dict[str, Any] | None: headers = {"Authorization": token} response = requests.get( - url=urljoin(self.url, "me"), + url=urljoin(self.auth_url, "me"), headers=headers, params={ "info": [ @@ -41,7 +42,7 @@ def check_token(self, token: str) -> dict[str, Any] | None: def logout(self, token: str) -> bool: headers = {"Authorization": token} - response = requests.post(url=f"{self.url}/logout", headers=headers) + response = requests.post(url=f"{self.auth_url}/logout", headers=headers) match response.status_code: case 200: @@ -50,3 +51,20 @@ def logout(self, token: str) -> bool: raise AuthFailed(response=response.json()["body"]) case 403: raise SessionExpired(response=response.json()["body"]) + + def get_user_data(self, token: str) -> dict[str | Any] | None: + headers = {"Authorization": token} + user_id = self.check_token(token)["id"] + response = requests.get( + url=f"{self.user_data_url}/user/{user_id}", headers=headers + ) + match response.status_code: + case 200: + return response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) + return None From f8d93bdc309694e8d14c7115b010e99c27c2ea49 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 18:09:03 +0300 Subject: [PATCH 03/22] Added userdata in user information --- auth_lib/aiomethods.py | 34 ++++++++++++++++++++++++++++------ auth_lib/fastapi.py | 38 ++++++++++++++++++++++++++++++++++---- auth_lib/methods.py | 30 ++++++++++++++++++++++++------ 3 files changed, 86 insertions(+), 16 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 26994b5..8e85c18 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -3,21 +3,22 @@ import aiohttp -from .exceptions import AuthFailed, SessionExpired +from .exceptions import AuthFailed, IncorrectData, NotFound, SessionExpired # See docs on https://api.test.profcomff.com/?urls.primaryName=auth class AsyncAuthLib: - url: str + auth_url: str + user_data_url: str def __init__(self, url: str): - self.url = url + self.auth_url = url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} async with aiohttp.ClientSession() as session: - response = await session.post(url=f"{self.url}/email/login", json=json) + response = await session.post(url=f"{self.auth_url}/email/login", json=json) match response.status: case 200: return await response.json() @@ -28,7 +29,7 @@ async def check_token(self, token: str) -> dict[str, Any] | None: headers = {"Authorization": token} async with aiohttp.request( "GET", - urljoin(self.url, "me"), + urljoin(self.auth_url, "me"), headers={"Authorization": token}, params={ "info": [ @@ -45,7 +46,9 @@ async def check_token(self, token: str) -> dict[str, Any] | None: async def logout(self, token: str) -> bool: headers = {"Authorization": token} async with aiohttp.ClientSession() as session: - response = await session.post(url=f"{self.url}/logout", headers=headers) + response = await session.post( + url=f"{self.auth_url}/logout", headers=headers + ) match response.status: case 200: @@ -54,3 +57,22 @@ async def logout(self, token: str) -> bool: raise AuthFailed(response=await response.json()) case 403: raise SessionExpired(response=await response.json()) + + async def get_user_data(self, token: str) -> dict[str | Any] | None: + headers = {"Authorization": token} + user_get = await self.check_token(token) + user_id = user_get["id"] + async with aiohttp.ClientSession() as session: + response = await session.get( + url=f"{self.user_data_url}/user/{user_id}", headers=headers + ) + match response.status: + case 200: + return await response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) + return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index d61cfad..dac76e9 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,8 +14,10 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" + USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False + ENABLE_USER_DATA: bool = False model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") @@ -29,23 +31,38 @@ def __init__( scopes: list[str] = [], auto_error: bool | None = None, allow_none: bool | None = None, + enable_user_data: bool | None = None, auth_url=None, # Для обратной совместимости + user_data_url=None, ) -> None: if auth_url is not None: warn( "auth_url in args deprecated, use AUTH_URL env instead", DeprecationWarning, ) + if user_data_url is not None: + warn( + "user_data_url in args deprecated, use USER_DATA_URL env instead", + DeprecationWarning, + ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" + self.user_data_url = user_data_url or self.settings.USER_DATA_URL + if not self.user_data_url.endswith("/"): + self.user_data_url = self.user_data_url + "/" self.auto_error = ( auto_error if auto_error is not None else self.settings.AUTH_AUTO_ERROR ) self.allow_none = ( allow_none if allow_none is not None else self.settings.AUTH_ALLOW_NONE ) + self.enable_user_data = ( + enable_user_data + if enable_user_data is not None + else self.settings.ENABLE_USER_DATA + ) self.scopes = scopes def _except(self): @@ -63,18 +80,31 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) + async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: + if not token and self.allow_none: + return None + if not token: + return self._except() + if self.enable_user_data: + return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) + return None + async def __call__( self, request: Request, ) -> dict[str, Any] | None: token = request.headers.get("Authorization") - user_session = await self._get_session(token) - if user_session is None: + result = await self._get_session(token) + if result is None: + return self._except() + user_data_info = await self._get_userdata(token) + if user_data_info is None: return self._except() + result["userdata"] = user_data_info session_scopes = set( - [scope["name"].lower() for scope in user_session["session_scopes"]] + [scope["name"].lower() for scope in result["session_scopes"]] ) required_scopes = set([scope.lower() for scope in self.scopes]) if required_scopes - session_scopes: self._except() - return user_session + return result diff --git a/auth_lib/methods.py b/auth_lib/methods.py index f9b9c02..cf7d730 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -3,20 +3,21 @@ import requests -from .exceptions import AuthFailed, SessionExpired +from .exceptions import AuthFailed, IncorrectData, NotFound, SessionExpired # See docs on https://api.test.profcomff.com/?urls.primaryName=auth class AuthLib: - url: str + auth_url: str + user_data_url: str def __init__(self, url: str): - self.url = url + self.auth_url = url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} - response = requests.post(url=f"{self.url}/email/login", json=json) + response = requests.post(url=f"{self.auth_url}/email/login", json=json) match response.status_code: case 200: return response.json() @@ -26,7 +27,7 @@ def email_login(self, email: str, password: str) -> dict[str, Any]: def check_token(self, token: str) -> dict[str, Any] | None: headers = {"Authorization": token} response = requests.get( - url=urljoin(self.url, "me"), + url=urljoin(self.auth_url, "me"), headers=headers, params={ "info": [ @@ -41,7 +42,7 @@ def check_token(self, token: str) -> dict[str, Any] | None: def logout(self, token: str) -> bool: headers = {"Authorization": token} - response = requests.post(url=f"{self.url}/logout", headers=headers) + response = requests.post(url=f"{self.auth_url}/logout", headers=headers) match response.status_code: case 200: @@ -50,3 +51,20 @@ def logout(self, token: str) -> bool: raise AuthFailed(response=response.json()["body"]) case 403: raise SessionExpired(response=response.json()["body"]) + + def get_user_data(self, token: str) -> dict[str | Any] | None: + headers = {"Authorization": token} + user_id = self.check_token(token)["id"] + response = requests.get( + url=f"{self.user_data_url}/user/{user_id}", headers=headers + ) + match response.status_code: + case 200: + return response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) + return None From dd6d75304ca3ed2b1c7a8d204597c64efb779184 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 21:42:19 +0300 Subject: [PATCH 04/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 20 +++++--------------- auth_lib/fastapi.py | 18 +++++++++++------- auth_lib/methods.py | 18 +++++------------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 8e85c18..957b300 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -10,7 +10,7 @@ class AsyncAuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -49,7 +49,6 @@ async def logout(self, token: str) -> bool: response = await session.post( url=f"{self.auth_url}/logout", headers=headers ) - match response.status: case 200: return True @@ -58,21 +57,12 @@ async def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=await response.json()) - async def get_user_data(self, token: str) -> dict[str | Any] | None: + async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_get = await self.check_token(token) - user_id = user_get["id"] async with aiohttp.ClientSession() as session: response = await session.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status: - case 200: - return await response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return await response.json() return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index dac76e9..ee73e47 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,7 +14,7 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" - USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" + USERDATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False ENABLE_USER_DATA: bool = False @@ -22,7 +22,7 @@ class UnionAuthSettings(BaseSettings): class UnionAuth(SecurityBase): - model = APIKey.construct(in_=APIKeyIn.header, name="Authorization") + model = APIKey.model_construct(in_=APIKeyIn.header, name="Authorization") scheme_name = "token" settings = UnionAuthSettings() @@ -42,14 +42,14 @@ def __init__( ) if user_data_url is not None: warn( - "user_data_url in args deprecated, use USER_DATA_URL env instead", + "userdata_url in args deprecated, use USERDATA_URL env instead", DeprecationWarning, ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" - self.user_data_url = user_data_url or self.settings.USER_DATA_URL + self.user_data_url = user_data_url or self.settings.USERDATA_URL if not self.user_data_url.endswith("/"): self.user_data_url = self.user_data_url + "/" self.auto_error = ( @@ -80,13 +80,17 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) - async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: + async def _get_userdata( + self, token: str | None, user_id: int + ) -> dict[str, Any] | None: if not token and self.allow_none: return None if not token: return self._except() if self.enable_user_data: - return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) + return await AsyncAuthLib(url=self.user_data_url).get_user_data( + token, user_id + ) return None async def __call__( @@ -97,7 +101,7 @@ async def __call__( result = await self._get_session(token) if result is None: return self._except() - user_data_info = await self._get_userdata(token) + user_data_info = await self._get_userdata(token, result["id"]) if user_data_info is None: return self._except() result["userdata"] = user_data_info diff --git a/auth_lib/methods.py b/auth_lib/methods.py index cf7d730..da1ee19 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -10,7 +10,7 @@ class AuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -52,19 +52,11 @@ def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=response.json()["body"]) - def get_user_data(self, token: str) -> dict[str | Any] | None: + def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_id = self.check_token(token)["id"] response = requests.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status_code: - case 200: - return response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return response.json() return None From 6aa18a41630cf59dd2409224ac07acf734aef19e Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 21:42:19 +0300 Subject: [PATCH 05/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 20 +++++--------------- auth_lib/fastapi.py | 18 +++++++++++------- auth_lib/methods.py | 18 +++++------------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 8e85c18..957b300 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -10,7 +10,7 @@ class AsyncAuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -49,7 +49,6 @@ async def logout(self, token: str) -> bool: response = await session.post( url=f"{self.auth_url}/logout", headers=headers ) - match response.status: case 200: return True @@ -58,21 +57,12 @@ async def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=await response.json()) - async def get_user_data(self, token: str) -> dict[str | Any] | None: + async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_get = await self.check_token(token) - user_id = user_get["id"] async with aiohttp.ClientSession() as session: response = await session.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status: - case 200: - return await response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return await response.json() return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index dac76e9..ee73e47 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,7 +14,7 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" - USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" + USERDATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False ENABLE_USER_DATA: bool = False @@ -22,7 +22,7 @@ class UnionAuthSettings(BaseSettings): class UnionAuth(SecurityBase): - model = APIKey.construct(in_=APIKeyIn.header, name="Authorization") + model = APIKey.model_construct(in_=APIKeyIn.header, name="Authorization") scheme_name = "token" settings = UnionAuthSettings() @@ -42,14 +42,14 @@ def __init__( ) if user_data_url is not None: warn( - "user_data_url in args deprecated, use USER_DATA_URL env instead", + "userdata_url in args deprecated, use USERDATA_URL env instead", DeprecationWarning, ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" - self.user_data_url = user_data_url or self.settings.USER_DATA_URL + self.user_data_url = user_data_url or self.settings.USERDATA_URL if not self.user_data_url.endswith("/"): self.user_data_url = self.user_data_url + "/" self.auto_error = ( @@ -80,13 +80,17 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) - async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: + async def _get_userdata( + self, token: str | None, user_id: int + ) -> dict[str, Any] | None: if not token and self.allow_none: return None if not token: return self._except() if self.enable_user_data: - return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) + return await AsyncAuthLib(url=self.user_data_url).get_user_data( + token, user_id + ) return None async def __call__( @@ -97,7 +101,7 @@ async def __call__( result = await self._get_session(token) if result is None: return self._except() - user_data_info = await self._get_userdata(token) + user_data_info = await self._get_userdata(token, result["id"]) if user_data_info is None: return self._except() result["userdata"] = user_data_info diff --git a/auth_lib/methods.py b/auth_lib/methods.py index cf7d730..da1ee19 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -10,7 +10,7 @@ class AuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -52,19 +52,11 @@ def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=response.json()["body"]) - def get_user_data(self, token: str) -> dict[str | Any] | None: + def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_id = self.check_token(token)["id"] response = requests.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status_code: - case 200: - return response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return response.json() return None From 8c50fed3b5564a070774bca5056710fe368e2ca6 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 21:51:41 +0300 Subject: [PATCH 06/22] Added userdata in user information. Fixes after review. --- auth_lib/methods.py | 1 + 1 file changed, 1 insertion(+) diff --git a/auth_lib/methods.py b/auth_lib/methods.py index da1ee19..abd9edd 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -60,3 +60,4 @@ def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: if response.ok: return response.json() return None + From 3001a8b77e3d7988c235812582e1f3951cd8d5c9 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 21:53:39 +0300 Subject: [PATCH 07/22] Added userdata in user information. Fixes after review. --- auth_lib/methods.py | 1 - 1 file changed, 1 deletion(-) diff --git a/auth_lib/methods.py b/auth_lib/methods.py index abd9edd..da1ee19 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -60,4 +60,3 @@ def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: if response.ok: return response.json() return None - From a90e9e2a7cdac9afb85c42d6c28e195d8b311857 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 22:02:29 +0300 Subject: [PATCH 08/22] Revert "Added userdata in user information. Fixes after review." This reverts commit 6aa18a41630cf59dd2409224ac07acf734aef19e. --- auth_lib/aiomethods.py | 20 +++++++++++++++----- auth_lib/fastapi.py | 18 +++++++----------- auth_lib/methods.py | 18 +++++++++++++----- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 957b300..8e85c18 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -10,7 +10,7 @@ class AsyncAuthLib: auth_url: str - userdata_url: str + user_data_url: str def __init__(self, url: str): self.auth_url = url @@ -49,6 +49,7 @@ async def logout(self, token: str) -> bool: response = await session.post( url=f"{self.auth_url}/logout", headers=headers ) + match response.status: case 200: return True @@ -57,12 +58,21 @@ async def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=await response.json()) - async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: + async def get_user_data(self, token: str) -> dict[str | Any] | None: headers = {"Authorization": token} + user_get = await self.check_token(token) + user_id = user_get["id"] async with aiohttp.ClientSession() as session: response = await session.get( - url=f"{self.userdata_url}/user/{user_id}", headers=headers + url=f"{self.user_data_url}/user/{user_id}", headers=headers ) - if response.ok: - return await response.json() + match response.status: + case 200: + return await response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index ee73e47..dac76e9 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,7 +14,7 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" - USERDATA_URL: str = "https://api.test.profcomff.com/userdata/" + USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False ENABLE_USER_DATA: bool = False @@ -22,7 +22,7 @@ class UnionAuthSettings(BaseSettings): class UnionAuth(SecurityBase): - model = APIKey.model_construct(in_=APIKeyIn.header, name="Authorization") + model = APIKey.construct(in_=APIKeyIn.header, name="Authorization") scheme_name = "token" settings = UnionAuthSettings() @@ -42,14 +42,14 @@ def __init__( ) if user_data_url is not None: warn( - "userdata_url in args deprecated, use USERDATA_URL env instead", + "user_data_url in args deprecated, use USER_DATA_URL env instead", DeprecationWarning, ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" - self.user_data_url = user_data_url or self.settings.USERDATA_URL + self.user_data_url = user_data_url or self.settings.USER_DATA_URL if not self.user_data_url.endswith("/"): self.user_data_url = self.user_data_url + "/" self.auto_error = ( @@ -80,17 +80,13 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) - async def _get_userdata( - self, token: str | None, user_id: int - ) -> dict[str, Any] | None: + async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: if not token and self.allow_none: return None if not token: return self._except() if self.enable_user_data: - return await AsyncAuthLib(url=self.user_data_url).get_user_data( - token, user_id - ) + return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) return None async def __call__( @@ -101,7 +97,7 @@ async def __call__( result = await self._get_session(token) if result is None: return self._except() - user_data_info = await self._get_userdata(token, result["id"]) + user_data_info = await self._get_userdata(token) if user_data_info is None: return self._except() result["userdata"] = user_data_info diff --git a/auth_lib/methods.py b/auth_lib/methods.py index da1ee19..cf7d730 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -10,7 +10,7 @@ class AuthLib: auth_url: str - userdata_url: str + user_data_url: str def __init__(self, url: str): self.auth_url = url @@ -52,11 +52,19 @@ def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=response.json()["body"]) - def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: + def get_user_data(self, token: str) -> dict[str | Any] | None: headers = {"Authorization": token} + user_id = self.check_token(token)["id"] response = requests.get( - url=f"{self.userdata_url}/user/{user_id}", headers=headers + url=f"{self.user_data_url}/user/{user_id}", headers=headers ) - if response.ok: - return response.json() + match response.status_code: + case 200: + return response.json() + case 403: + raise SessionExpired(response=response.json()["body"]) + case 404: + raise NotFound(response=response.json()["body"]) + case 422: + raise IncorrectData(response=response.json()["body"]) return None From a45cf06e1c6964a900c482a0ffcfa1d9cc157e0c Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 22:09:40 +0300 Subject: [PATCH 09/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 19 +++++-------------- auth_lib/fastapi.py | 40 ++++++++++++++++++++++------------------ auth_lib/methods.py | 18 +++++------------- 3 files changed, 32 insertions(+), 45 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 8e85c18..16b1437 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -10,7 +10,7 @@ class AsyncAuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -58,21 +58,12 @@ async def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=await response.json()) - async def get_user_data(self, token: str) -> dict[str | Any] | None: + async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_get = await self.check_token(token) - user_id = user_get["id"] async with aiohttp.ClientSession() as session: response = await session.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status: - case 200: - return await response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return await response.json() return None diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index dac76e9..172cfd7 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -14,15 +14,15 @@ class UnionAuthSettings(BaseSettings): AUTH_URL: str = "https://api.test.profcomff.com/auth/" - USER_DATA_URL: str = "https://api.test.profcomff.com/userdata/" + USERDATA_URL: str = "https://api.test.profcomff.com/userdata/" AUTH_AUTO_ERROR: bool = True AUTH_ALLOW_NONE: bool = False - ENABLE_USER_DATA: bool = False + ENABLE_USERDATA: bool = False model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") class UnionAuth(SecurityBase): - model = APIKey.construct(in_=APIKeyIn.header, name="Authorization") + model = APIKey.model_construct(in_=APIKeyIn.header, name="Authorization") scheme_name = "token" settings = UnionAuthSettings() @@ -31,37 +31,37 @@ def __init__( scopes: list[str] = [], auto_error: bool | None = None, allow_none: bool | None = None, - enable_user_data: bool | None = None, + enable_userdata: bool | None = None, auth_url=None, # Для обратной совместимости - user_data_url=None, + userdata_url=None, ) -> None: if auth_url is not None: warn( "auth_url in args deprecated, use AUTH_URL env instead", DeprecationWarning, ) - if user_data_url is not None: + if userdata_url is not None: warn( - "user_data_url in args deprecated, use USER_DATA_URL env instead", + "userdata_url in args deprecated, use USERDATA_URL env instead", DeprecationWarning, ) super().__init__() self.auth_url = auth_url or self.settings.AUTH_URL if not self.auth_url.endswith("/"): self.auth_url = self.auth_url + "/" - self.user_data_url = user_data_url or self.settings.USER_DATA_URL - if not self.user_data_url.endswith("/"): - self.user_data_url = self.user_data_url + "/" + self.userdata_url = userdata_url or self.settings.USERDATA_URL + if not self.userdata_url.endswith("/"): + self.userdata_url = self.userdata_url + "/" self.auto_error = ( auto_error if auto_error is not None else self.settings.AUTH_AUTO_ERROR ) self.allow_none = ( allow_none if allow_none is not None else self.settings.AUTH_ALLOW_NONE ) - self.enable_user_data = ( - enable_user_data - if enable_user_data is not None - else self.settings.ENABLE_USER_DATA + self.enable_userdata = ( + enable_userdata + if enable_userdata is not None + else self.settings.ENABLE_USERDATA ) self.scopes = scopes @@ -80,13 +80,17 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return self._except() return await AsyncAuthLib(url=self.auth_url).check_token(token) - async def _get_userdata(self, token: str | None) -> dict[str, Any] | None: + async def _get_userdata( + self, token: str | None, user_id: int + ) -> dict[str, Any] | None: if not token and self.allow_none: return None if not token: return self._except() - if self.enable_user_data: - return await AsyncAuthLib(url=self.user_data_url).get_user_data(token) + if self.enable_userdata: + return await AsyncAuthLib(url=self.userdata_url).get_user_data( + token, user_id + ) return None async def __call__( @@ -97,7 +101,7 @@ async def __call__( result = await self._get_session(token) if result is None: return self._except() - user_data_info = await self._get_userdata(token) + user_data_info = await self._get_userdata(token, result["id"]) if user_data_info is None: return self._except() result["userdata"] = user_data_info diff --git a/auth_lib/methods.py b/auth_lib/methods.py index cf7d730..da1ee19 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -10,7 +10,7 @@ class AuthLib: auth_url: str - user_data_url: str + userdata_url: str def __init__(self, url: str): self.auth_url = url @@ -52,19 +52,11 @@ def logout(self, token: str) -> bool: case 403: raise SessionExpired(response=response.json()["body"]) - def get_user_data(self, token: str) -> dict[str | Any] | None: + def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} - user_id = self.check_token(token)["id"] response = requests.get( - url=f"{self.user_data_url}/user/{user_id}", headers=headers + url=f"{self.userdata_url}/user/{user_id}", headers=headers ) - match response.status_code: - case 200: - return response.json() - case 403: - raise SessionExpired(response=response.json()["body"]) - case 404: - raise NotFound(response=response.json()["body"]) - case 422: - raise IncorrectData(response=response.json()["body"]) + if response.ok: + return response.json() return None From 1b16e9496015b248ff31e63fe3e991003715a3db Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 22:14:27 +0300 Subject: [PATCH 10/22] Added userdata in user information. Fixes after review. --- auth_lib/fastapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index 172cfd7..8cca82c 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -102,7 +102,7 @@ async def __call__( if result is None: return self._except() user_data_info = await self._get_userdata(token, result["id"]) - if user_data_info is None: + if user_data_info is None and self.enable_userdata: return self._except() result["userdata"] = user_data_info session_scopes = set( From 7dbbc2837744b61bb1c09f4709666b6c617d31f2 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 22:53:45 +0300 Subject: [PATCH 11/22] Added userdata in user information. Fixes after review. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 043430f..46cf562 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -with open("README.md", "r") as readme_file: +with open("README.md", "r", encoding='utf-8') as readme_file: readme = readme_file.read() setup( From 01411335a2e56514e7c9c18153442ceee2a377f9 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 22:54:51 +0300 Subject: [PATCH 12/22] Added userdata in user information. Fixes after review. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 46cf562..f959531 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -with open("README.md", "r", encoding='utf-8') as readme_file: +with open("README.md", "r", encoding="utf-8") as readme_file: readme = readme_file.read() setup( From 51e41e7654ea5a6ce5efbab053c78d8db0354def Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 23:03:00 +0300 Subject: [PATCH 13/22] Added userdata in user information. Fixes after review. --- auth_lib/fastapi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index 8cca82c..333f9f8 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -78,7 +78,7 @@ async def _get_session(self, token: str | None) -> dict[str, Any] | None: return None if not token: return self._except() - return await AsyncAuthLib(url=self.auth_url).check_token(token) + return await AsyncAuthLib(auth_url=self.auth_url).check_token(token) async def _get_userdata( self, token: str | None, user_id: int @@ -88,7 +88,7 @@ async def _get_userdata( if not token: return self._except() if self.enable_userdata: - return await AsyncAuthLib(url=self.userdata_url).get_user_data( + return await AsyncAuthLib(userdata_url=self.userdata_url).get_user_data( token, user_id ) return None From fcb412988527eb10d8333fae89bb0aaa68a7a6b4 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sat, 29 Jul 2023 23:05:38 +0300 Subject: [PATCH 14/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 5 +++-- auth_lib/methods.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 16b1437..6b7aaa3 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -12,8 +12,9 @@ class AsyncAuthLib: auth_url: str userdata_url: str - def __init__(self, url: str): - self.auth_url = url + def __init__(self, auth_url: str, userdata_url: str): + self.auth_url = auth_url + self.userdata_url = userdata_url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} diff --git a/auth_lib/methods.py b/auth_lib/methods.py index da1ee19..ec1877a 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -12,8 +12,9 @@ class AuthLib: auth_url: str userdata_url: str - def __init__(self, url: str): - self.auth_url = url + def __init__(self, auth_url: str, userdata_url: str): + self.auth_url = auth_url + self.userdata_url = userdata_url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} From b61536bf03aaf118db25a3eb9f92f8deaffd466d Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sun, 30 Jul 2023 02:56:08 +0300 Subject: [PATCH 15/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 8 +++++--- auth_lib/methods.py | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 6b7aaa3..1f7dfd4 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -12,9 +12,11 @@ class AsyncAuthLib: auth_url: str userdata_url: str - def __init__(self, auth_url: str, userdata_url: str): - self.auth_url = auth_url - self.userdata_url = userdata_url + def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): + if auth_url is not None: + self.auth_url = auth_url + if userdata_url is not None: + self.userdata_url = userdata_url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} diff --git a/auth_lib/methods.py b/auth_lib/methods.py index ec1877a..6e6b120 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -12,9 +12,11 @@ class AuthLib: auth_url: str userdata_url: str - def __init__(self, auth_url: str, userdata_url: str): - self.auth_url = auth_url - self.userdata_url = userdata_url + def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): + if auth_url is not None: + self.auth_url = auth_url + if userdata_url is not None: + self.userdata_url = userdata_url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} From 99f5a7d2dc44f0d834b0d226131cfbfe50d68afc Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Sun, 30 Jul 2023 03:17:21 +0300 Subject: [PATCH 16/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 6 ++---- auth_lib/methods.py | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 1f7dfd4..090ec64 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -13,10 +13,8 @@ class AsyncAuthLib: userdata_url: str def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): - if auth_url is not None: - self.auth_url = auth_url - if userdata_url is not None: - self.userdata_url = userdata_url + self.auth_url = auth_url or self.auth_url + self.userdata_url = userdata_url or self.userdata_url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} diff --git a/auth_lib/methods.py b/auth_lib/methods.py index 6e6b120..fee56f5 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -13,10 +13,8 @@ class AuthLib: userdata_url: str def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): - if auth_url is not None: - self.auth_url = auth_url - if userdata_url is not None: - self.userdata_url = userdata_url + self.auth_url = auth_url or self.auth_url + self.userdata_url = userdata_url or self.userdata_url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} From 0b6ce3746fa7d431f814359fda4f2f7c613c1e47 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 17:00:53 +0300 Subject: [PATCH 17/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 8 +++++--- auth_lib/fastapi.py | 2 +- auth_lib/methods.py | 7 +++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 090ec64..e80ed14 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -19,7 +19,9 @@ def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = No async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} async with aiohttp.ClientSession() as session: - response = await session.post(url=f"{self.auth_url}/email/login", json=json) + response = await session.post( + url=urljoin(self.auth_url, "email/login"), json=json + ) match response.status: case 200: return await response.json() @@ -48,7 +50,7 @@ async def logout(self, token: str) -> bool: headers = {"Authorization": token} async with aiohttp.ClientSession() as session: response = await session.post( - url=f"{self.auth_url}/logout", headers=headers + url=urljoin(self.auth_url, "logout"), headers=headers ) match response.status: @@ -63,7 +65,7 @@ async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | Non headers = {"Authorization": token} async with aiohttp.ClientSession() as session: response = await session.get( - url=f"{self.userdata_url}/user/{user_id}", headers=headers + url=urljoin(self.userdata_url, f"/user/{user_id}"), headers=headers ) if response.ok: return await response.json() diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index 333f9f8..9ffe85e 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -104,7 +104,7 @@ async def __call__( user_data_info = await self._get_userdata(token, result["id"]) if user_data_info is None and self.enable_userdata: return self._except() - result["userdata"] = user_data_info + result["userdata"] = user_data_info["items"] session_scopes = set( [scope["name"].lower() for scope in result["session_scopes"]] ) diff --git a/auth_lib/methods.py b/auth_lib/methods.py index fee56f5..d419db5 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -18,7 +18,7 @@ def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = No def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} - response = requests.post(url=f"{self.auth_url}/email/login", json=json) + response = requests.post(url=urljoin(self.auth_url, "email/login"), json=json) match response.status_code: case 200: return response.json() @@ -43,8 +43,7 @@ def check_token(self, token: str) -> dict[str, Any] | None: def logout(self, token: str) -> bool: headers = {"Authorization": token} - response = requests.post(url=f"{self.auth_url}/logout", headers=headers) - + response = requests.post(url=urljoin(self.auth_url, "logout"), headers=headers) match response.status_code: case 200: return True @@ -56,7 +55,7 @@ def logout(self, token: str) -> bool: def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | None: headers = {"Authorization": token} response = requests.get( - url=f"{self.userdata_url}/user/{user_id}", headers=headers + url=urljoin(self.userdata_url, f"user/{user_id}"), headers=headers ) if response.ok: return response.json() From 6e9526f3aeec74a4d5b7759f9abf1004e6ffabd3 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 17:45:41 +0300 Subject: [PATCH 18/22] Added userdata in user information. Fixes after review. --- auth_lib/fastapi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index 9ffe85e..bcc8ead 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -102,9 +102,9 @@ async def __call__( if result is None: return self._except() user_data_info = await self._get_userdata(token, result["id"]) - if user_data_info is None and self.enable_userdata: - return self._except() - result["userdata"] = user_data_info["items"] + result["userdata"] = [] + if user_data_info is not None and self.enable_userdata: + result["userdata"].extend(user_data_info["items"]) session_scopes = set( [scope["name"].lower() for scope in result["session_scopes"]] ) From 113db3ddbf82530d0cc114f01e59b1fa5ce7a502 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 17:46:37 +0300 Subject: [PATCH 19/22] Added userdata in user information. Fixes after review. --- auth_lib/fastapi.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index bcc8ead..d1d71f2 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -101,10 +101,11 @@ async def __call__( result = await self._get_session(token) if result is None: return self._except() - user_data_info = await self._get_userdata(token, result["id"]) - result["userdata"] = [] - if user_data_info is not None and self.enable_userdata: - result["userdata"].extend(user_data_info["items"]) + if self.enable_userdata: + user_data_info = await self._get_userdata(token, result["id"]) + result["userdata"] = [] + if user_data_info is not None: + result["userdata"].extend(user_data_info["items"]) session_scopes = set( [scope["name"].lower() for scope in result["session_scopes"]] ) From e2b0527a2029cf7019eccf4eda0faeeb7b449de2 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 18:26:37 +0300 Subject: [PATCH 20/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index e80ed14..1df84d9 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -65,7 +65,7 @@ async def get_user_data(self, token: str, user_id: int) -> dict[str | Any] | Non headers = {"Authorization": token} async with aiohttp.ClientSession() as session: response = await session.get( - url=urljoin(self.userdata_url, f"/user/{user_id}"), headers=headers + url=urljoin(self.userdata_url, f"user/{user_id}"), headers=headers ) if response.ok: return await response.json() From 54f4fc2940f3bca8f1490e92d7426db38ce21b96 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 18:51:30 +0300 Subject: [PATCH 21/22] Added userdata in user information. Fixes after review. --- auth_lib/aiomethods.py | 4 ++-- auth_lib/methods.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth_lib/aiomethods.py b/auth_lib/aiomethods.py index 1df84d9..25951e0 100644 --- a/auth_lib/aiomethods.py +++ b/auth_lib/aiomethods.py @@ -13,8 +13,8 @@ class AsyncAuthLib: userdata_url: str def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): - self.auth_url = auth_url or self.auth_url - self.userdata_url = userdata_url or self.userdata_url + self.auth_url = auth_url + self.userdata_url = userdata_url async def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} diff --git a/auth_lib/methods.py b/auth_lib/methods.py index d419db5..48cbe67 100644 --- a/auth_lib/methods.py +++ b/auth_lib/methods.py @@ -13,8 +13,8 @@ class AuthLib: userdata_url: str def __init__(self, *, auth_url: str | None = None, userdata_url: str | None = None): - self.auth_url = auth_url or self.auth_url - self.userdata_url = userdata_url or self.userdata_url + self.auth_url = auth_url + self.userdata_url = userdata_url def email_login(self, email: str, password: str) -> dict[str, Any]: json = {"email": email, "password": password} From f14566a157d6b7ac54a75761f6c0e5c074fe7bf7 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Mon, 31 Jul 2023 22:36:54 +0300 Subject: [PATCH 22/22] Added userdata in user information. Fixes after review. --- auth_lib/fastapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_lib/fastapi.py b/auth_lib/fastapi.py index d1d71f2..7555840 100644 --- a/auth_lib/fastapi.py +++ b/auth_lib/fastapi.py @@ -105,7 +105,7 @@ async def __call__( user_data_info = await self._get_userdata(token, result["id"]) result["userdata"] = [] if user_data_info is not None: - result["userdata"].extend(user_data_info["items"]) + result["userdata"] = user_data_info["items"] session_scopes = set( [scope["name"].lower() for scope in result["session_scopes"]] )