Authlib 1.9.0__tar.gz → 1.9.2__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.
- {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/PKG-INFO +2 -2
- {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/requires.txt +1 -1
- {authlib-1.9.0 → authlib-1.9.2}/PKG-INFO +2 -2
- {authlib-1.9.0 → authlib-1.9.2}/authlib/consts.py +1 -1
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/oct_key.py +4 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/drafts/id_jag.py +35 -7
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7592/endpoint.py +18 -3
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/device_code.py +1 -1
- {authlib-1.9.0 → authlib-1.9.2}/pyproject.toml +11 -1
- {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/SOURCES.txt +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/dependency_links.txt +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/top_level.txt +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/LICENSE +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/MANIFEST.in +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/README.md +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/_joserfc_helpers.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/encoding.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/language.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/security.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/common/urls.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/deprecate.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/async_app.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/async_openid.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/framework_integration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/registry.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/sync_app.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/sync_openid.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/apps.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/integration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/nonce.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/endpoints.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/requests.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/signals.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/apps.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/integration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/cache.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/requests.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/signals.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/_compat.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/assertion_client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/oauth1_client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/oauth2_client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/utils.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/assertion_session.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/oauth1_session.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/oauth2_session.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/utils.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/client_mixin.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/functions.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/tokens_mixins.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/apps.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/integration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_algorithms.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_enc_cryptodome.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_enc_cryptography.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/jwk.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/jws.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/jwe.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/_cryptography_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/asymmetric_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/base_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/jwk.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/key_set.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/ec_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_algs.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_encs.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_zips.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jws_algs.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/rsa_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/jwt.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/jws_eddsa.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/okp_key.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/base_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/client_auth.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/parameters.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/rsa.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/signature.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/wrapper.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/auth.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/base.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/drafts/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/authenticate_client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/endpoint.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/authorization_code.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/base.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/client_credentials.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/implicit.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/refresh_token.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/resource_owner_password_credentials.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/hooks.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/parameters.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/requests.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/resource_protector.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/token_endpoint.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/wrappers.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/parameters.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/token.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/validator.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/parameters.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/revocation.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7521/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7521/client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/assertion.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/auth.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/client.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/jwt_bearer.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/token.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/validator.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/endpoint.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7592/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7636/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7636/challenge.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/introspection.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/token_validator.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/well_known.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/endpoint.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8693/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/introspection.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/revocation.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/token.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/token_validator.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/authorization_server.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/discovery.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/registration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/discovery.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/parameter.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/authorization_request.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/errors.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/_legacy.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/code.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/hybrid.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/implicit.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/userinfo.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/util.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/models.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/well_known.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/registration/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/registration/claims.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/__init__.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/discovery.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/end_session.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/registration.py +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/setup.cfg +0 -0
- {authlib-1.9.0 → authlib-1.9.2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Authlib
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.2
|
|
4
4
|
Summary: The ultimate Python library in building OAuth and OpenID Connect servers and clients.
|
|
5
5
|
Author-email: Hsiaoming Yang <me@lepture.com>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -33,7 +33,7 @@ Requires-Python: >=3.10
|
|
|
33
33
|
Description-Content-Type: text/markdown
|
|
34
34
|
License-File: LICENSE
|
|
35
35
|
Requires-Dist: cryptography>=45.0.1
|
|
36
|
-
Requires-Dist: joserfc>=1.6.
|
|
36
|
+
Requires-Dist: joserfc>=1.6.8
|
|
37
37
|
Dynamic: license-file
|
|
38
38
|
|
|
39
39
|
<div align="center">
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
cryptography>=45.0.1
|
|
2
|
-
joserfc>=1.6.
|
|
2
|
+
joserfc>=1.6.8
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Authlib
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.2
|
|
4
4
|
Summary: The ultimate Python library in building OAuth and OpenID Connect servers and clients.
|
|
5
5
|
Author-email: Hsiaoming Yang <me@lepture.com>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -33,7 +33,7 @@ Requires-Python: >=3.10
|
|
|
33
33
|
Description-Content-Type: text/markdown
|
|
34
34
|
License-File: LICENSE
|
|
35
35
|
Requires-Dist: cryptography>=45.0.1
|
|
36
|
-
Requires-Dist: joserfc>=1.6.
|
|
36
|
+
Requires-Dist: joserfc>=1.6.8
|
|
37
37
|
Dynamic: license-file
|
|
38
38
|
|
|
39
39
|
<div align="center">
|
|
@@ -65,6 +65,10 @@ class OctKey(Key):
|
|
|
65
65
|
|
|
66
66
|
@staticmethod
|
|
67
67
|
def _check_key(raw_key):
|
|
68
|
+
# Per RFC 7518 §3.2, an HMAC key must be at least as long as the hash output.
|
|
69
|
+
if not raw_key:
|
|
70
|
+
raise ValueError("oct key material must not be empty")
|
|
71
|
+
|
|
68
72
|
# PEM parsers accept leading text, including comments and whitespace.
|
|
69
73
|
if any(marker in raw_key for marker in POSSIBLE_UNSAFE_KEYS):
|
|
70
74
|
raise ValueError("This key may not be safe to import")
|
|
@@ -32,6 +32,7 @@ from authlib.common.security import generate_token
|
|
|
32
32
|
from ..rfc6749 import BaseGrant
|
|
33
33
|
from ..rfc6749 import InvalidGrantError
|
|
34
34
|
from ..rfc6749 import InvalidRequestError
|
|
35
|
+
from ..rfc6749 import InvalidScopeError
|
|
35
36
|
from ..rfc6749 import TokenEndpointMixin
|
|
36
37
|
from ..rfc6749 import UnauthorizedClientError
|
|
37
38
|
from ..rfc6749 import scope_to_list
|
|
@@ -106,14 +107,15 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
106
107
|
|
|
107
108
|
:param key: signing key (private key or shared secret)
|
|
108
109
|
:param issuer: ``iss`` claim - identifies the IdP
|
|
109
|
-
:param audience: ``aud`` claim - the resource AS
|
|
110
|
+
:param audience: ``aud`` claim - the resource AS issuer identifier
|
|
110
111
|
:param subject: ``sub`` claim - the end user (required)
|
|
111
|
-
:param client_id: ``client_id`` claim - the
|
|
112
|
+
:param client_id: ``client_id`` claim - the client identifier at the
|
|
113
|
+
resource AS
|
|
112
114
|
:param jti: ``jti`` claim (auto-generated when *None*)
|
|
113
115
|
:param issued_at: ``iat`` claim (defaults to now)
|
|
114
116
|
:param expires_at: ``exp`` claim
|
|
115
117
|
:param claims: additional claims dict
|
|
116
|
-
:param kwargs: forwarded to
|
|
118
|
+
:param kwargs: forwarded to ``sign_jwt_bearer_assertion``
|
|
117
119
|
(e.g. ``alg="RS256"``)
|
|
118
120
|
:return: compact-serialised JWT string
|
|
119
121
|
"""
|
|
@@ -181,6 +183,7 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
181
183
|
self.request.client = client
|
|
182
184
|
log.debug("Validate token request of %s", client)
|
|
183
185
|
self.validate_requested_scope()
|
|
186
|
+
self.request.scope = self._resolve_scope(claims)
|
|
184
187
|
|
|
185
188
|
# Authenticate user from sub claim (required by ID-JAG).
|
|
186
189
|
user = self.authenticate_user(claims["sub"])
|
|
@@ -188,7 +191,7 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
188
191
|
raise InvalidGrantError(description="Invalid 'sub' value in assertion")
|
|
189
192
|
|
|
190
193
|
# Application policy check.
|
|
191
|
-
scopes = scope_to_list(self.request.
|
|
194
|
+
scopes = scope_to_list(self.request.scope) or []
|
|
192
195
|
if not self.check_id_jag_permission(client, user, scopes):
|
|
193
196
|
raise InvalidGrantError(
|
|
194
197
|
description=(
|
|
@@ -202,7 +205,7 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
202
205
|
def create_token_response(self):
|
|
203
206
|
"""Issue an access token (no refresh token per the ID-JAG draft)."""
|
|
204
207
|
token = self.generate_token(
|
|
205
|
-
scope=self.request.
|
|
208
|
+
scope=self.request.scope,
|
|
206
209
|
user=self.request.user,
|
|
207
210
|
include_refresh_token=False,
|
|
208
211
|
)
|
|
@@ -240,6 +243,31 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
240
243
|
|
|
241
244
|
return token.claims
|
|
242
245
|
|
|
246
|
+
def _resolve_scope(self, claims):
|
|
247
|
+
"""Return the scope of the access token.
|
|
248
|
+
|
|
249
|
+
The scope is bounded by the scope claim of the assertion, and
|
|
250
|
+
defaults to it. Without that claim, the requested scope is used.
|
|
251
|
+
"""
|
|
252
|
+
requested = self.request.payload.scope
|
|
253
|
+
if "scope" not in claims:
|
|
254
|
+
return requested
|
|
255
|
+
|
|
256
|
+
granted = claims["scope"]
|
|
257
|
+
if not isinstance(granted, str):
|
|
258
|
+
raise InvalidGrantError(description="Invalid 'scope' claim in assertion")
|
|
259
|
+
|
|
260
|
+
if not requested:
|
|
261
|
+
return granted
|
|
262
|
+
|
|
263
|
+
# RFC 7521 §4.1: "the requested scope MUST be equal to or less than
|
|
264
|
+
# the scope originally granted to the authorized accessor."
|
|
265
|
+
if not set(scope_to_list(requested)).issubset(scope_to_list(granted)):
|
|
266
|
+
raise InvalidScopeError(
|
|
267
|
+
description="The requested scope exceeds the 'scope' claim in assertion"
|
|
268
|
+
)
|
|
269
|
+
return requested
|
|
270
|
+
|
|
243
271
|
def _extract_assertion(self, assertion: str):
|
|
244
272
|
try:
|
|
245
273
|
obj = jws.extract_compact(to_bytes(assertion))
|
|
@@ -285,8 +313,8 @@ class IDJAGGrant(BaseGrant, TokenEndpointMixin):
|
|
|
285
313
|
def get_audiences(self) -> list:
|
|
286
314
|
"""Return the list of valid ``aud`` values for this AS.
|
|
287
315
|
|
|
288
|
-
|
|
289
|
-
The returned list must be non-empty; ``aud`` validation is
|
|
316
|
+
Per the ID-JAG draft, ``aud`` is the issuer identifier of the
|
|
317
|
+
Resource Authorization Server. The returned list must be non-empty; ``aud`` validation is
|
|
290
318
|
mandatory for ID-JAG assertions.
|
|
291
319
|
"""
|
|
292
320
|
raise NotImplementedError()
|
|
@@ -39,6 +39,11 @@ class ClientConfigurationEndpoint:
|
|
|
39
39
|
status_code=401, description="The client does not exist on this server."
|
|
40
40
|
)
|
|
41
41
|
|
|
42
|
+
# The registration access token is only valid for the client it was
|
|
43
|
+
# issued to.
|
|
44
|
+
if not token.check_client(client):
|
|
45
|
+
raise AccessDeniedError()
|
|
46
|
+
|
|
42
47
|
if not self.check_permission(client, request):
|
|
43
48
|
# If the client does not have permission to read its record, the server
|
|
44
49
|
# MUST return an HTTP 403 Forbidden.
|
|
@@ -146,25 +151,35 @@ class ClientConfigurationEndpoint:
|
|
|
146
151
|
raise NotImplementedError()
|
|
147
152
|
|
|
148
153
|
def authenticate_token(self, request):
|
|
149
|
-
"""Authenticate
|
|
154
|
+
"""Authenticate the registration access token of the request.
|
|
150
155
|
Developers MUST implement this method in subclass::
|
|
151
156
|
|
|
152
157
|
def authenticate_token(self, request):
|
|
153
158
|
auth = request.headers.get("Authorization")
|
|
154
159
|
return get_token_by_auth(auth)
|
|
155
160
|
|
|
161
|
+
The token MUST implement
|
|
162
|
+
:meth:`~authlib.oauth2.rfc6749.TokenMixin.check_client`. Requests
|
|
163
|
+
are denied when the token was not issued to the requested client.
|
|
164
|
+
|
|
156
165
|
:return: token instance
|
|
157
166
|
"""
|
|
158
167
|
raise NotImplementedError()
|
|
159
168
|
|
|
160
169
|
def authenticate_client(self, request):
|
|
161
|
-
"""Read
|
|
170
|
+
"""Read the client from the client configuration endpoint URL.
|
|
162
171
|
Developers MUST implement this method in subclass::
|
|
163
172
|
|
|
173
|
+
from urllib.parse import urlparse
|
|
174
|
+
|
|
175
|
+
|
|
164
176
|
def authenticate_client(self, request):
|
|
165
|
-
|
|
177
|
+
path = urlparse(request.uri).path
|
|
178
|
+
client_id = path.rstrip("/").rsplit("/", 1)[-1]
|
|
166
179
|
return Client.get(client_id=client_id)
|
|
167
180
|
|
|
181
|
+
The route parameter of the web framework can also be used.
|
|
182
|
+
|
|
168
183
|
:return: client instance
|
|
169
184
|
"""
|
|
170
185
|
raise NotImplementedError()
|
|
@@ -171,7 +171,7 @@ class DeviceCodeGrant(BaseGrant, TokenEndpointMixin):
|
|
|
171
171
|
|
|
172
172
|
user_id, allowed = data.split()
|
|
173
173
|
user = User.get(user_id)
|
|
174
|
-
return user,
|
|
174
|
+
return user, allowed == "1"
|
|
175
175
|
|
|
176
176
|
Note, user grant information is saved by verification endpoint.
|
|
177
177
|
"""
|
|
@@ -8,7 +8,7 @@ description = "The ultimate Python library in building OAuth and OpenID Connect
|
|
|
8
8
|
authors = [{name = "Hsiaoming Yang", email="me@lepture.com"}]
|
|
9
9
|
dependencies = [
|
|
10
10
|
"cryptography>=45.0.1",
|
|
11
|
-
"joserfc>=1.6.
|
|
11
|
+
"joserfc>=1.6.8",
|
|
12
12
|
]
|
|
13
13
|
license = {text = "BSD-3-Clause"}
|
|
14
14
|
requires-python = ">=3.10"
|
|
@@ -52,6 +52,7 @@ dev = [
|
|
|
52
52
|
"pytest>=8.2",
|
|
53
53
|
"pytest-asyncio>=0.21",
|
|
54
54
|
"pytest-env>=1.0",
|
|
55
|
+
"scriv[toml]>=1.8.0",
|
|
55
56
|
"tox-uv >= 1.16.0",
|
|
56
57
|
]
|
|
57
58
|
|
|
@@ -94,6 +95,15 @@ version = {attr = "authlib.__version__"}
|
|
|
94
95
|
where = ["."]
|
|
95
96
|
include = ["authlib", "authlib.*"]
|
|
96
97
|
|
|
98
|
+
[tool.scriv]
|
|
99
|
+
format = "rst"
|
|
100
|
+
changelog = "docs/upgrades/changelog.rst"
|
|
101
|
+
version = "literal: authlib/consts.py: version"
|
|
102
|
+
categories = ["Breaking changes", "Added", "Changed", "Deprecated", "Fixed", "Security"]
|
|
103
|
+
rst_header_chars = "-~"
|
|
104
|
+
compact_fragments = true
|
|
105
|
+
entry_title_template = "Version {{ version }} — {{ date.strftime('%Y-%m-%d') }}"
|
|
106
|
+
|
|
97
107
|
[tool.ruff.lint]
|
|
98
108
|
select = [
|
|
99
109
|
"B", # flake8-bugbear
|
|
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
|
|
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
|
|
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
|
|
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
|
{authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/resource_owner_password_credentials.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
|
|
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
|
|
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
|