oidcauthlib 3.0.7__tar.gz → 3.0.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {oidcauthlib-3.0.7/oidcauthlib.egg-info → oidcauthlib-3.0.8}/PKG-INFO +3 -2
- oidcauthlib-3.0.8/VERSION +1 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/auth_manager.py +6 -1
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/cache/oauth_memory_cache.py +1 -2
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/fastapi_auth_manager.py +16 -7
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8/oidcauthlib.egg-info}/PKG-INFO +3 -2
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/pyproject.toml +2 -1
- oidcauthlib-3.0.7/VERSION +0 -1
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/LICENSE +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/MANIFEST.in +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/README.md +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/auth_helper.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/cache/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/cache/oauth_cache.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/cache/oauth_mongo_cache.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/config/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/config/auth_config.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/config/auth_config_reader.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/dcr/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/dcr/dcr_client.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/dcr/dcr_manager.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/dcr/dcr_registration.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/exceptions/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/exceptions/authorization_bearer_token_expired_exception.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/exceptions/authorization_bearer_token_invalid_exception.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/exceptions/authorization_bearer_token_missing_exception.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/exceptions/authorization_needed_exception.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/middleware/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/middleware/request_scope_middleware.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/middleware/token_reader_middleware.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/auth.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/base_db_model.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/cache_item.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/client_key_set.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/models/token.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/base_repository.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/memory/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/memory/memory_repository.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/mongo/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/mongo/mongo_repository.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/repository_factory.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/routers/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/routers/auth_router.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/token_reader.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/auth_server_metadata.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/auth_server_metadata_discovery.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/well_known_configuration_cache.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/well_known_configuration_cache_result.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/well_known_configuration_manager.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/container/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/container/oidc_authlib_container_factory.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/open_telemetry/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/open_telemetry/attribute_names.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/open_telemetry/span_names.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/py.typed +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/cache_to_collection_mapper.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/memory_storage_factory.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/mongo_gridfs_db.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/mongo_gridfs_exception.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/mongo_storage_factory.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/storage_factory.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/storage/storage_factory_creator.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/cached.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/environment/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/environment/abstract_environment_variables.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/environment/oidc_environment_variables.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/logger/__init__.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/logger/log_levels.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/logger/logging_response.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/logger/logging_transport.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/mongo_url_utils.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/utilities/url_validator.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib.egg-info/SOURCES.txt +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib.egg-info/dependency_links.txt +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib.egg-info/requires.txt +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib.egg-info/top_level.txt +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/setup.cfg +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/tests/test_mongo_url_utils.py +0 -0
- {oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/tests/test_simple.py +0 -0
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oidcauthlib
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.8
|
|
4
4
|
Summary: oidcauthlib
|
|
5
5
|
Author-email: Imran Qureshi <imran.qureshi@bwell.com>
|
|
6
|
-
License
|
|
6
|
+
License: Apache-2.0
|
|
7
7
|
Project-URL: Homepage, https://github.com/icanbwell/oidc-auth-lib
|
|
8
8
|
Classifier: Development Status :: 4 - Beta
|
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
12
|
Requires-Python: >=3.12
|
|
12
13
|
Description-Content-Type: text/markdown
|
|
13
14
|
License-File: LICENSE
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.0.8
|
|
@@ -38,6 +38,7 @@ from oidcauthlib.utilities.url_validator import validate_url
|
|
|
38
38
|
|
|
39
39
|
logger = logging.getLogger(__name__)
|
|
40
40
|
logger.setLevel(SRC_LOG_LEVELS["AUTH"])
|
|
41
|
+
OAUTH_STATE_CACHE_TTL_SECONDS: int = int(os.getenv("OAUTH_STATE_CACHE_TTL_SECONDS", "300"))
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
class AuthManager:
|
|
@@ -273,7 +274,11 @@ class AuthManager:
|
|
|
273
274
|
if "nonce" in rv:
|
|
274
275
|
state_data["nonce"] = rv["nonce"]
|
|
275
276
|
cache_key = f"_state_{auth_provider}_{state}"
|
|
276
|
-
await self.cache.set(
|
|
277
|
+
await self.cache.set(
|
|
278
|
+
cache_key,
|
|
279
|
+
json.dumps({"data": state_data}),
|
|
280
|
+
expires=OAUTH_STATE_CACHE_TTL_SECONDS,
|
|
281
|
+
)
|
|
277
282
|
logger.debug(f"Saved OAuth state to cache key={cache_key} data={state_data}")
|
|
278
283
|
return cast(str, rv["url"])
|
|
279
284
|
|
|
@@ -14,11 +14,10 @@ class OAuthMemoryCache(OAuthCache):
|
|
|
14
14
|
def id(self) -> uuid.UUID:
|
|
15
15
|
return self.id_
|
|
16
16
|
|
|
17
|
-
_cache: dict[str, str] = {}
|
|
18
|
-
|
|
19
17
|
def __init__(self) -> None:
|
|
20
18
|
"""Initialize the AuthCache."""
|
|
21
19
|
self.id_ = uuid.uuid4()
|
|
20
|
+
self._cache: dict[str, str] = {}
|
|
22
21
|
|
|
23
22
|
@override
|
|
24
23
|
async def delete(self, key: str) -> None:
|
|
@@ -143,15 +143,20 @@ class FastAPIAuthManager(AuthManager):
|
|
|
143
143
|
# Retrieve state data saved by create_authorization_url
|
|
144
144
|
cache_key = f"_state_{auth_provider}_{state}"
|
|
145
145
|
cached_value = await self.cache.get(cache_key)
|
|
146
|
-
if cached_value:
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
"
|
|
146
|
+
if not cached_value:
|
|
147
|
+
from authlib.integrations.base_client import OAuthError
|
|
148
|
+
|
|
149
|
+
logger.error(
|
|
150
|
+
"No cached state data found for key=%s — aborting token exchange "
|
|
151
|
+
"(missing code_verifier/redirect_uri makes this a security risk)",
|
|
152
152
|
cache_key,
|
|
153
153
|
)
|
|
154
|
-
|
|
154
|
+
raise OAuthError(
|
|
155
|
+
error="invalid_state",
|
|
156
|
+
description="OAuth state validation failed: no cached state data found. "
|
|
157
|
+
"The state may have expired or was already consumed.",
|
|
158
|
+
)
|
|
159
|
+
state_data = json.loads(cached_value).get("data", {})
|
|
155
160
|
|
|
156
161
|
# Build params for fetch_access_token
|
|
157
162
|
params: Dict[str, Any] = {"code": code, "state": state}
|
|
@@ -163,6 +168,10 @@ class FastAPIAuthManager(AuthManager):
|
|
|
163
168
|
|
|
164
169
|
token = await client.fetch_access_token(**params) # type: ignore[no-untyped-call]
|
|
165
170
|
|
|
171
|
+
# Delete the cache entry only after a successful token exchange so the
|
|
172
|
+
# user can retry the callback if the exchange fails transiently.
|
|
173
|
+
await self.cache.delete(cache_key)
|
|
174
|
+
|
|
166
175
|
# Parse id_token if present (OpenID Connect).
|
|
167
176
|
# parse_id_token requires jwks_uri in server_metadata to verify the
|
|
168
177
|
# signature. When the provider was registered with explicit endpoints
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oidcauthlib
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.8
|
|
4
4
|
Summary: oidcauthlib
|
|
5
5
|
Author-email: Imran Qureshi <imran.qureshi@bwell.com>
|
|
6
|
-
License
|
|
6
|
+
License: Apache-2.0
|
|
7
7
|
Project-URL: Homepage, https://github.com/icanbwell/oidc-auth-lib
|
|
8
8
|
Classifier: Development Status :: 4 - Beta
|
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
12
|
Requires-Python: >=3.12
|
|
12
13
|
Description-Content-Type: text/markdown
|
|
13
14
|
License-File: LICENSE
|
|
@@ -7,7 +7,7 @@ name = "oidcauthlib"
|
|
|
7
7
|
dynamic = ["version"]
|
|
8
8
|
description = "oidcauthlib"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
license = "Apache-2.0"
|
|
10
|
+
license = { text = "Apache-2.0" }
|
|
11
11
|
requires-python = ">=3.12"
|
|
12
12
|
authors = [
|
|
13
13
|
{ name = "Imran Qureshi", email = "imran.qureshi@bwell.com" },
|
|
@@ -16,6 +16,7 @@ classifiers = [
|
|
|
16
16
|
"Development Status :: 4 - Beta",
|
|
17
17
|
"Programming Language :: Python :: 3",
|
|
18
18
|
"Operating System :: OS Independent",
|
|
19
|
+
"License :: OSI Approved :: Apache Software License",
|
|
19
20
|
]
|
|
20
21
|
dependencies = [
|
|
21
22
|
"httpx>=0.27.2",
|
oidcauthlib-3.0.7/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.0.7
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/middleware/request_scope_middleware.py
RENAMED
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/middleware/token_reader_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/memory/memory_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/repository/mongo/mongo_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/auth/well_known_configuration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oidcauthlib-3.0.7 → oidcauthlib-3.0.8}/oidcauthlib/container/oidc_authlib_container_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|