python3-commons 0.8.31__tar.gz → 0.8.32__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.
- {python3_commons-0.8.31/src/python3_commons.egg-info → python3_commons-0.8.32}/PKG-INFO +1 -1
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/auth.py +31 -23
- {python3_commons-0.8.31 → python3_commons-0.8.32/src/python3_commons.egg-info}/PKG-INFO +1 -1
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.coveragerc +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.github/workflows/python-publish.yaml +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.github/workflows/release-on-tag-push.yml +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.gitignore +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.pre-commit-config.yaml +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/.python-version +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/AUTHORS.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/CHANGELOG.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/LICENSE +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/README.md +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/README.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/Makefile +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/_static/.gitignore +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/authors.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/changelog.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/conf.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/index.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/license.rst +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/pyproject.toml +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/setup.cfg +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/__init__.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/api_client.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/audit.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/cache.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/conf.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/__init__.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/helpers.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/__init__.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/auth.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/common.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/rbac.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/fs.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/helpers.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/__init__.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/filters.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/formatters.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/object_storage.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/permissions.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/__init__.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/json.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgpack.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgspec.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/SOURCES.txt +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/dependency_links.txt +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/requires.txt +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/top_level.txt +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/conftest.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_audit.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_helpers.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_msgpack.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_msgspec.py +0 -0
- {python3_commons-0.8.31 → python3_commons-0.8.32}/uv.lock +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
import logging
|
2
2
|
from http import HTTPStatus
|
3
|
-
from typing import Annotated, Sequence
|
3
|
+
from typing import Annotated, Any, Callable, Coroutine, Sequence, Type, TypeVar
|
4
4
|
|
5
5
|
import aiohttp
|
6
6
|
from fastapi import Depends, HTTPException
|
@@ -20,6 +20,9 @@ class TokenData(BaseModel):
|
|
20
20
|
iss: str
|
21
21
|
|
22
22
|
|
23
|
+
T = TypeVar('T', bound=TokenData)
|
24
|
+
|
25
|
+
|
23
26
|
OIDC_CONFIG_URL = f'{oidc_settings.authority_url}/.well-known/openid-configuration'
|
24
27
|
_JWKS: dict | None = None
|
25
28
|
|
@@ -52,31 +55,36 @@ async def fetch_jwks(jwks_uri: str) -> dict:
|
|
52
55
|
return await response.json()
|
53
56
|
|
54
57
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
def get_token_verifier(token_cls: Type[T]) -> Callable[[HTTPAuthorizationCredentials], Coroutine[Any, Any, T | None]]:
|
59
|
+
async def get_verified_token(
|
60
|
+
authorization: Annotated[HTTPAuthorizationCredentials, Depends(bearer_security)],
|
61
|
+
) -> T | None:
|
62
|
+
"""
|
63
|
+
Verify the JWT access token using OIDC authority JWKS.
|
64
|
+
"""
|
65
|
+
global _JWKS
|
66
|
+
|
67
|
+
if not oidc_settings.enabled:
|
68
|
+
return None
|
62
69
|
|
63
|
-
|
64
|
-
return None
|
70
|
+
token = authorization.credentials
|
65
71
|
|
66
|
-
|
72
|
+
try:
|
73
|
+
if not _JWKS:
|
74
|
+
openid_config = await fetch_openid_config()
|
75
|
+
_JWKS = await fetch_jwks(openid_config['jwks_uri'])
|
67
76
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
if oidc_settings.client_id:
|
78
|
+
payload = jwt.decode(token, _JWKS, algorithms=['RS256'], audience=oidc_settings.client_id)
|
79
|
+
else:
|
80
|
+
payload = jwt.decode(token, _JWKS, algorithms=['RS256'])
|
72
81
|
|
73
|
-
|
74
|
-
payload = jwt.decode(token, _JWKS, algorithms=['RS256'], audience=oidc_settings.client_id)
|
75
|
-
else:
|
76
|
-
payload = jwt.decode(token, _JWKS, algorithms=['RS256'])
|
82
|
+
token_data = token_cls(**payload)
|
77
83
|
|
78
|
-
|
84
|
+
return token_data
|
85
|
+
except jwt.ExpiredSignatureError:
|
86
|
+
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail='Token has expired')
|
87
|
+
except JWTError as e:
|
88
|
+
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=f'Token is invalid: {str(e)}')
|
79
89
|
|
80
|
-
|
81
|
-
except JWTError as e:
|
82
|
-
raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail=f'Token is invalid: {str(e)}')
|
90
|
+
return get_verified_token
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/__init__.py
RENAMED
File without changes
|
File without changes
|
{python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgpack.py
RENAMED
File without changes
|
{python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgspec.py
RENAMED
File without changes
|
File without changes
|
{python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
{python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|