From e0ca1d40b0b09e335902330889b251a3e973aaed Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Wed, 13 Mar 2024 14:48:48 +0400 Subject: [PATCH 1/4] GH-36: Memorize `access_token` property --- src/fastapi_oauth2/core.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fastapi_oauth2/core.py b/src/fastapi_oauth2/core.py index 1eb6c59..76486e2 100644 --- a/src/fastapi_oauth2/core.py +++ b/src/fastapi_oauth2/core.py @@ -54,6 +54,7 @@ class OAuth2Core: _oauth_client: Optional[WebApplicationClient] = None _authorization_endpoint: str = None _token_endpoint: str = None + _access_token: str = None _state: str = None def __init__(self, client: OAuth2Client) -> None: @@ -70,7 +71,9 @@ def __init__(self, client: OAuth2Client) -> None: @property def access_token(self) -> str: - return self._oauth_client.access_token + if not self._access_token: + self._access_token = self._oauth_client.access_token + return self._access_token def get_redirect_uri(self, request: Request) -> str: return urljoin(str(request.base_url), "/oauth2/%s/token" % self.provider) From 135755376b828590f5c9c244f8efdf05057b93a8 Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Wed, 13 Mar 2024 14:50:00 +0400 Subject: [PATCH 2/4] GH-36: Test `access_token` memorization --- tests/conftest.py | 4 ++++ tests/test_oauth2.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 26fc29b..5766231 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -78,6 +78,10 @@ def auth(request: Request): ) return response + @app_router.get("/access-token") + def access_token(request: Request): + return Response(request.auth.provider.access_token) + if with_idp: @app_router.get("/oauth2/{provider}/token") async def token(request: Request, provider: str): diff --git a/tests/test_oauth2.py b/tests/test_oauth2.py index a9f9d2c..6d10669 100644 --- a/tests/test_oauth2.py +++ b/tests/test_oauth2.py @@ -62,3 +62,21 @@ async def test_oauth2_csrf_workflow(get_app): await oauth2_workflow(get_app, idp=True, ssr=False, authorize_query=aq, token_query=tq, use_header=True) except AssertionError: assert aq != tq + + +@pytest.mark.anyio +async def test_core_access_token(get_app): + async with AsyncClient(app=get_app(with_idp=True, with_ssr=True), base_url="http://test") as client: + response = await client.get("/oauth2/test/authorize") + authorization_endpoint = response.headers.get("location") + response = await client.get(authorization_endpoint) + token_url = response.headers.get("location") + query = {k: v[0] for k, v in parse_qs(urlparse(token_url).query).items()} + token_url = "%s?%s" % (token_url.split("?")[0], urlencode(query)) + await client.get(token_url) + + response = await client.get("/access-token") + assert response.content != b"" + + response = await client.get("/access-token") + assert response.content != b"" From 6e130c0a1bb062962057d2f701478b72c309a95b Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Wed, 13 Mar 2024 14:55:35 +0400 Subject: [PATCH 3/4] Upgrade the version to `1.0.0` - first stable release --- src/fastapi_oauth2/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fastapi_oauth2/__init__.py b/src/fastapi_oauth2/__init__.py index 81a2814..5becc17 100644 --- a/src/fastapi_oauth2/__init__.py +++ b/src/fastapi_oauth2/__init__.py @@ -1 +1 @@ -__version__ = "1.0.0-beta.3" +__version__ = "1.0.0" From 1246c1a8319892c8eeadf107796b79837385e29b Mon Sep 17 00:00:00 2001 From: Artyom Vancyan Date: Wed, 13 Mar 2024 14:56:25 +0400 Subject: [PATCH 4/4] Update the "Development Status" classifier --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index f8a7875..df6742c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,7 +27,7 @@ license_files = LICENSE platforms = unix, linux, osx, win32 classifiers = Operating System :: OS Independent - Development Status :: 4 - Beta + Development Status :: 5 - Production/Stable Framework :: FastAPI Programming Language :: Python Programming Language :: Python :: 3