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.
Files changed (55) hide show
  1. {python3_commons-0.8.31/src/python3_commons.egg-info → python3_commons-0.8.32}/PKG-INFO +1 -1
  2. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/auth.py +31 -23
  3. {python3_commons-0.8.31 → python3_commons-0.8.32/src/python3_commons.egg-info}/PKG-INFO +1 -1
  4. {python3_commons-0.8.31 → python3_commons-0.8.32}/.coveragerc +0 -0
  5. {python3_commons-0.8.31 → python3_commons-0.8.32}/.github/workflows/python-publish.yaml +0 -0
  6. {python3_commons-0.8.31 → python3_commons-0.8.32}/.github/workflows/release-on-tag-push.yml +0 -0
  7. {python3_commons-0.8.31 → python3_commons-0.8.32}/.gitignore +0 -0
  8. {python3_commons-0.8.31 → python3_commons-0.8.32}/.pre-commit-config.yaml +0 -0
  9. {python3_commons-0.8.31 → python3_commons-0.8.32}/.python-version +0 -0
  10. {python3_commons-0.8.31 → python3_commons-0.8.32}/AUTHORS.rst +0 -0
  11. {python3_commons-0.8.31 → python3_commons-0.8.32}/CHANGELOG.rst +0 -0
  12. {python3_commons-0.8.31 → python3_commons-0.8.32}/LICENSE +0 -0
  13. {python3_commons-0.8.31 → python3_commons-0.8.32}/README.md +0 -0
  14. {python3_commons-0.8.31 → python3_commons-0.8.32}/README.rst +0 -0
  15. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/Makefile +0 -0
  16. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/_static/.gitignore +0 -0
  17. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/authors.rst +0 -0
  18. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/changelog.rst +0 -0
  19. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/conf.py +0 -0
  20. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/index.rst +0 -0
  21. {python3_commons-0.8.31 → python3_commons-0.8.32}/docs/license.rst +0 -0
  22. {python3_commons-0.8.31 → python3_commons-0.8.32}/pyproject.toml +0 -0
  23. {python3_commons-0.8.31 → python3_commons-0.8.32}/setup.cfg +0 -0
  24. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/__init__.py +0 -0
  25. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/api_client.py +0 -0
  26. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/audit.py +0 -0
  27. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/cache.py +0 -0
  28. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/conf.py +0 -0
  29. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/__init__.py +0 -0
  30. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/helpers.py +0 -0
  31. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/__init__.py +0 -0
  32. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/auth.py +0 -0
  33. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/common.py +0 -0
  34. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/db/models/rbac.py +0 -0
  35. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/fs.py +0 -0
  36. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/helpers.py +0 -0
  37. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/__init__.py +0 -0
  38. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/filters.py +0 -0
  39. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/log/formatters.py +0 -0
  40. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/object_storage.py +0 -0
  41. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/permissions.py +0 -0
  42. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/__init__.py +0 -0
  43. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/json.py +0 -0
  44. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgpack.py +0 -0
  45. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons/serializers/msgspec.py +0 -0
  46. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  47. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  48. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/requires.txt +0 -0
  49. {python3_commons-0.8.31 → python3_commons-0.8.32}/src/python3_commons.egg-info/top_level.txt +0 -0
  50. {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/conftest.py +0 -0
  51. {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_audit.py +0 -0
  52. {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_helpers.py +0 -0
  53. {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_msgpack.py +0 -0
  54. {python3_commons-0.8.31 → python3_commons-0.8.32}/tests/test_msgspec.py +0 -0
  55. {python3_commons-0.8.31 → python3_commons-0.8.32}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.8.31
3
+ Version: 0.8.32
4
4
  Summary: Re-usable Python3 code
5
5
  Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
6
6
  License-Expression: GPL-3.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
- async def get_verified_token(
56
- authorization: Annotated[HTTPAuthorizationCredentials, Depends(bearer_security)],
57
- ) -> TokenData | None:
58
- """
59
- Verify the JWT access token using OIDC authority JWKS.
60
- """
61
- global _JWKS
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
- if not oidc_settings.enabled:
64
- return None
70
+ token = authorization.credentials
65
71
 
66
- token = authorization.credentials
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
- try:
69
- if not _JWKS:
70
- openid_config = await fetch_openid_config()
71
- _JWKS = await fetch_jwks(openid_config['jwks_uri'])
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
- if oidc_settings.client_id:
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
- token_data = TokenData(**payload)
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
- return token_data
81
- except JWTError as e:
82
- raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail=f'Token is invalid: {str(e)}')
90
+ return get_verified_token
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.8.31
3
+ Version: 0.8.32
4
4
  Summary: Re-usable Python3 code
5
5
  Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
6
6
  License-Expression: GPL-3.0