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.
Files changed (227) hide show
  1. {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/PKG-INFO +2 -2
  2. {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/requires.txt +1 -1
  3. {authlib-1.9.0 → authlib-1.9.2}/PKG-INFO +2 -2
  4. {authlib-1.9.0 → authlib-1.9.2}/authlib/consts.py +1 -1
  5. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/oct_key.py +4 -0
  6. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/drafts/id_jag.py +35 -7
  7. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7592/endpoint.py +18 -3
  8. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/device_code.py +1 -1
  9. {authlib-1.9.0 → authlib-1.9.2}/pyproject.toml +11 -1
  10. {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/SOURCES.txt +0 -0
  11. {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/dependency_links.txt +0 -0
  12. {authlib-1.9.0 → authlib-1.9.2}/Authlib.egg-info/top_level.txt +0 -0
  13. {authlib-1.9.0 → authlib-1.9.2}/LICENSE +0 -0
  14. {authlib-1.9.0 → authlib-1.9.2}/MANIFEST.in +0 -0
  15. {authlib-1.9.0 → authlib-1.9.2}/README.md +0 -0
  16. {authlib-1.9.0 → authlib-1.9.2}/authlib/__init__.py +0 -0
  17. {authlib-1.9.0 → authlib-1.9.2}/authlib/_joserfc_helpers.py +0 -0
  18. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/__init__.py +0 -0
  19. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/encoding.py +0 -0
  20. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/errors.py +0 -0
  21. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/language.py +0 -0
  22. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/security.py +0 -0
  23. {authlib-1.9.0 → authlib-1.9.2}/authlib/common/urls.py +0 -0
  24. {authlib-1.9.0 → authlib-1.9.2}/authlib/deprecate.py +0 -0
  25. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/__init__.py +0 -0
  26. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/__init__.py +0 -0
  27. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/async_app.py +0 -0
  28. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/async_openid.py +0 -0
  29. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/errors.py +0 -0
  30. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/framework_integration.py +0 -0
  31. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/registry.py +0 -0
  32. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/sync_app.py +0 -0
  33. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/base_client/sync_openid.py +0 -0
  34. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/__init__.py +0 -0
  35. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/apps.py +0 -0
  36. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_client/integration.py +0 -0
  37. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/__init__.py +0 -0
  38. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/authorization_server.py +0 -0
  39. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/nonce.py +0 -0
  40. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth1/resource_protector.py +0 -0
  41. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/__init__.py +0 -0
  42. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/authorization_server.py +0 -0
  43. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/endpoints.py +0 -0
  44. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/requests.py +0 -0
  45. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/resource_protector.py +0 -0
  46. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/django_oauth2/signals.py +0 -0
  47. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/__init__.py +0 -0
  48. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/apps.py +0 -0
  49. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_client/integration.py +0 -0
  50. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/__init__.py +0 -0
  51. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/authorization_server.py +0 -0
  52. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/cache.py +0 -0
  53. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth1/resource_protector.py +0 -0
  54. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/__init__.py +0 -0
  55. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/authorization_server.py +0 -0
  56. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/errors.py +0 -0
  57. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/requests.py +0 -0
  58. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/resource_protector.py +0 -0
  59. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/flask_oauth2/signals.py +0 -0
  60. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/__init__.py +0 -0
  61. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/_compat.py +0 -0
  62. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/assertion_client.py +0 -0
  63. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/oauth1_client.py +0 -0
  64. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/oauth2_client.py +0 -0
  65. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/httpx_client/utils.py +0 -0
  66. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/__init__.py +0 -0
  67. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/assertion_session.py +0 -0
  68. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/oauth1_session.py +0 -0
  69. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/oauth2_session.py +0 -0
  70. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/requests_client/utils.py +0 -0
  71. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/__init__.py +0 -0
  72. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/client_mixin.py +0 -0
  73. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/functions.py +0 -0
  74. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/sqla_oauth2/tokens_mixins.py +0 -0
  75. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/__init__.py +0 -0
  76. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/apps.py +0 -0
  77. {authlib-1.9.0 → authlib-1.9.2}/authlib/integrations/starlette_client/integration.py +0 -0
  78. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/__init__.py +0 -0
  79. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/__init__.py +0 -0
  80. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_algorithms.py +0 -0
  81. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_enc_cryptodome.py +0 -0
  82. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/drafts/_jwe_enc_cryptography.py +0 -0
  83. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/errors.py +0 -0
  84. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/jwk.py +0 -0
  85. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/__init__.py +0 -0
  86. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/jws.py +0 -0
  87. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7515/models.py +0 -0
  88. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/__init__.py +0 -0
  89. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/jwe.py +0 -0
  90. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7516/models.py +0 -0
  91. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/__init__.py +0 -0
  92. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/_cryptography_key.py +0 -0
  93. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/asymmetric_key.py +0 -0
  94. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/base_key.py +0 -0
  95. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/jwk.py +0 -0
  96. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7517/key_set.py +0 -0
  97. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/__init__.py +0 -0
  98. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/ec_key.py +0 -0
  99. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_algs.py +0 -0
  100. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_encs.py +0 -0
  101. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jwe_zips.py +0 -0
  102. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/jws_algs.py +0 -0
  103. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/rsa_key.py +0 -0
  104. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7518/util.py +0 -0
  105. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/__init__.py +0 -0
  106. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/claims.py +0 -0
  107. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc7519/jwt.py +0 -0
  108. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/__init__.py +0 -0
  109. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/jws_eddsa.py +0 -0
  110. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/rfc8037/okp_key.py +0 -0
  111. {authlib-1.9.0 → authlib-1.9.2}/authlib/jose/util.py +0 -0
  112. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/__init__.py +0 -0
  113. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/client.py +0 -0
  114. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/errors.py +0 -0
  115. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/__init__.py +0 -0
  116. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/authorization_server.py +0 -0
  117. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/base_server.py +0 -0
  118. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/client_auth.py +0 -0
  119. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/errors.py +0 -0
  120. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/models.py +0 -0
  121. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/parameters.py +0 -0
  122. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/resource_protector.py +0 -0
  123. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/rsa.py +0 -0
  124. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/signature.py +0 -0
  125. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/util.py +0 -0
  126. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth1/rfc5849/wrapper.py +0 -0
  127. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/__init__.py +0 -0
  128. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/auth.py +0 -0
  129. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/base.py +0 -0
  130. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/claims.py +0 -0
  131. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/client.py +0 -0
  132. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/drafts/__init__.py +0 -0
  133. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/__init__.py +0 -0
  134. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/authenticate_client.py +0 -0
  135. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/authorization_server.py +0 -0
  136. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/endpoint.py +0 -0
  137. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/errors.py +0 -0
  138. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/__init__.py +0 -0
  139. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/authorization_code.py +0 -0
  140. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/base.py +0 -0
  141. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/client_credentials.py +0 -0
  142. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/implicit.py +0 -0
  143. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/refresh_token.py +0 -0
  144. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/grants/resource_owner_password_credentials.py +0 -0
  145. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/hooks.py +0 -0
  146. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/models.py +0 -0
  147. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/parameters.py +0 -0
  148. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/requests.py +0 -0
  149. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/resource_protector.py +0 -0
  150. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/token_endpoint.py +0 -0
  151. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/util.py +0 -0
  152. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6749/wrappers.py +0 -0
  153. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/__init__.py +0 -0
  154. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/errors.py +0 -0
  155. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/parameters.py +0 -0
  156. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/token.py +0 -0
  157. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc6750/validator.py +0 -0
  158. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/__init__.py +0 -0
  159. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/parameters.py +0 -0
  160. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7009/revocation.py +0 -0
  161. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7521/__init__.py +0 -0
  162. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7521/client.py +0 -0
  163. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/__init__.py +0 -0
  164. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/assertion.py +0 -0
  165. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/auth.py +0 -0
  166. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/client.py +0 -0
  167. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/jwt_bearer.py +0 -0
  168. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/token.py +0 -0
  169. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7523/validator.py +0 -0
  170. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/__init__.py +0 -0
  171. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/claims.py +0 -0
  172. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/endpoint.py +0 -0
  173. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7591/errors.py +0 -0
  174. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7592/__init__.py +0 -0
  175. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7636/__init__.py +0 -0
  176. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7636/challenge.py +0 -0
  177. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/__init__.py +0 -0
  178. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/introspection.py +0 -0
  179. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/models.py +0 -0
  180. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc7662/token_validator.py +0 -0
  181. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/__init__.py +0 -0
  182. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/models.py +0 -0
  183. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8414/well_known.py +0 -0
  184. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/__init__.py +0 -0
  185. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/endpoint.py +0 -0
  186. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/errors.py +0 -0
  187. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8628/models.py +0 -0
  188. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc8693/__init__.py +0 -0
  189. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/__init__.py +0 -0
  190. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/claims.py +0 -0
  191. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/introspection.py +0 -0
  192. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/revocation.py +0 -0
  193. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/token.py +0 -0
  194. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9068/token_validator.py +0 -0
  195. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/__init__.py +0 -0
  196. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/authorization_server.py +0 -0
  197. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/discovery.py +0 -0
  198. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/errors.py +0 -0
  199. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9101/registration.py +0 -0
  200. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/__init__.py +0 -0
  201. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/discovery.py +0 -0
  202. {authlib-1.9.0 → authlib-1.9.2}/authlib/oauth2/rfc9207/parameter.py +0 -0
  203. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/__init__.py +0 -0
  204. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/__init__.py +0 -0
  205. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/authorization_request.py +0 -0
  206. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/claims.py +0 -0
  207. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/errors.py +0 -0
  208. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/__init__.py +0 -0
  209. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/_legacy.py +0 -0
  210. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/code.py +0 -0
  211. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/hybrid.py +0 -0
  212. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/implicit.py +0 -0
  213. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/grants/util.py +0 -0
  214. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/models.py +0 -0
  215. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/userinfo.py +0 -0
  216. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/core/util.py +0 -0
  217. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/__init__.py +0 -0
  218. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/models.py +0 -0
  219. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/discovery/well_known.py +0 -0
  220. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/registration/__init__.py +0 -0
  221. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/registration/claims.py +0 -0
  222. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/__init__.py +0 -0
  223. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/discovery.py +0 -0
  224. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/end_session.py +0 -0
  225. {authlib-1.9.0 → authlib-1.9.2}/authlib/oidc/rpinitiated/registration.py +0 -0
  226. {authlib-1.9.0 → authlib-1.9.2}/setup.cfg +0 -0
  227. {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.0
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.1
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.1
2
+ joserfc>=1.6.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Authlib
3
- Version: 1.9.0
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.1
36
+ Requires-Dist: joserfc>=1.6.8
37
37
  Dynamic: license-file
38
38
 
39
39
  <div align="center">
@@ -1,5 +1,5 @@
1
1
  name = "Authlib"
2
- version = "1.9.0"
2
+ version = "1.9.2"
3
3
  author = "Hsiaoming Yang <me@lepture.com>"
4
4
  homepage = "https://authlib.org"
5
5
  default_user_agent = f"{name}/{version} (+{homepage})"
@@ -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 token endpoint
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 application
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 :func:`sign_jwt_bearer_assertion`
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.payload.scope) or []
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.payload.scope,
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
- Typically the token endpoint URL and/or the AS issuer identifier.
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 current credential who is requesting to register a client.
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 a client from the request payload.
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
- client_id = request.payload.data.get("client_id")
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, bool(allowed)
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.1",
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