usso 0.28.27__py3-none-any.whl → 0.28.28__py3-none-any.whl

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.
usso/client.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from urllib.parse import urlparse
2
3
 
3
4
  import usso_jwt.exceptions
4
5
  import usso_jwt.schemas
@@ -22,6 +23,8 @@ class UssoAuth:
22
23
  self,
23
24
  *,
24
25
  jwt_config: AvailableJwtConfigs | None = None,
26
+ from_base_usso_url: str | None = None,
27
+ **kwargs: object,
25
28
  ) -> None:
26
29
  """Initialize the USSO authentication client.
27
30
 
@@ -31,6 +34,7 @@ class UssoAuth:
31
34
  if jwt_config is None:
32
35
  jwt_config = AuthConfig()
33
36
  self.jwt_configs = AuthConfig.validate_jwt_configs(jwt_config)
37
+ self.from_base_usso_url = from_base_usso_url
34
38
 
35
39
  def user_data_from_token(
36
40
  self,
@@ -68,6 +72,25 @@ class UssoAuth:
68
72
  except usso_jwt.exceptions.JWTError as e:
69
73
  exp = e
70
74
 
75
+ if self.from_base_usso_url:
76
+ try:
77
+ jwt_obj = usso_jwt.schemas.JWT(
78
+ token=token, config=jwk_config, payload_class=UserData
79
+ )
80
+ iss = jwt_obj.unverified_payload.iss
81
+ iss_domain = urlparse(iss).netloc
82
+ jwt_obj.config.jwks_url = (
83
+ f"{self.from_base_usso_url}/.well-known/jwks.json?"
84
+ f"domain={iss_domain}"
85
+ )
86
+ if jwt_obj.verify(
87
+ expected_token_type=expected_token_type,
88
+ **kwargs,
89
+ ):
90
+ return jwt_obj.payload
91
+ except usso_jwt.exceptions.JWTError as e:
92
+ exp = e
93
+
71
94
  _handle_exception(
72
95
  "Unauthorized",
73
96
  message=str(exp) if exp else None,
usso/config.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import os
2
3
  from typing import Any, Literal, Union
3
4
 
4
5
  import usso_jwt.config
@@ -7,6 +8,8 @@ from pydantic import BaseModel, model_validator
7
8
  from .user import UserData
8
9
  from .utils.string_utils import get_authorization_scheme_param
9
10
 
11
+ BASE_USSO_URL = os.getenv("BASE_USSO_URL") or "https://sso.usso.io"
12
+
10
13
 
11
14
  class HeaderConfig(BaseModel):
12
15
  type: Literal["Authorization", "Cookie", "CustomHeader"] = "Cookie"
@@ -42,7 +45,7 @@ class HeaderConfig(BaseModel):
42
45
 
43
46
 
44
47
  class APIHeaderConfig(HeaderConfig):
45
- verify_endpoint: str = "https://sso.usso.io/api/sso/v1/apikeys/verify"
48
+ verify_endpoint: str = f"{BASE_USSO_URL}/api/sso/v1/apikeys/verify"
46
49
 
47
50
 
48
51
  class AuthConfig(usso_jwt.config.JWTConfig):
@@ -14,15 +14,20 @@ class USSOAuthentication(UssoAuth):
14
14
  def __init__(
15
15
  self,
16
16
  jwt_config: AvailableJwtConfigs | None = None,
17
+ *,
17
18
  raise_exception: bool = True,
18
19
  expected_token_type: str = "access",
20
+ from_base_usso_url: str | None = None,
19
21
  ) -> None:
20
22
  if jwt_config is None:
21
23
  jwt_config = AuthConfig()
22
24
 
23
- super().__init__(jwt_config=jwt_config)
25
+ super().__init__(
26
+ jwt_config=jwt_config, from_base_usso_url=from_base_usso_url
27
+ )
24
28
  self.raise_exception = raise_exception
25
29
  self.expected_token_type = expected_token_type
30
+ self.from_base_usso_url = from_base_usso_url
26
31
 
27
32
  def __call__(self, request: Request) -> UserData:
28
33
  return self.usso_access_security(request)
@@ -41,7 +46,6 @@ class USSOAuthentication(UssoAuth):
41
46
  return token
42
47
  return None
43
48
 
44
- # @instance_method
45
49
  def usso_access_security(self, request: Request) -> UserData | None:
46
50
  """Return the user associated with a token value."""
47
51
  api_key = self.get_request_api_key(request)
@@ -62,7 +66,6 @@ class USSOAuthentication(UssoAuth):
62
66
  raise_exception=self.raise_exception,
63
67
  )
64
68
 
65
- # @instance_method
66
69
  def jwt_access_security_ws(self, websocket: WebSocket) -> UserData | None:
67
70
  """Return the user associated with a token value."""
68
71
  api_key = self.get_request_api_key(websocket)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usso
3
- Version: 0.28.27
3
+ Version: 0.28.28
4
4
  Summary: A plug-and-play client for integrating universal single sign-on (SSO) with Python frameworks, enabling secure and seamless authentication across microservices.
5
5
  Author-email: Mahdi Kiani <mahdikiany@gmail.com>
6
6
  Maintainer-email: Mahdi Kiani <mahdikiany@gmail.com>
@@ -28,7 +28,7 @@ Requires-Dist: cachetools
28
28
  Requires-Dist: singleton_package
29
29
  Requires-Dist: json-advanced
30
30
  Requires-Dist: httpx
31
- Requires-Dist: usso-jwt>=0.2.0
31
+ Requires-Dist: usso-jwt>=0.2.6
32
32
  Provides-Extra: fastapi
33
33
  Requires-Dist: fastapi>=0.65.0; extra == "fastapi"
34
34
  Requires-Dist: uvicorn[standard]>=0.13.0; extra == "fastapi"
@@ -1,14 +1,14 @@
1
1
  usso/__init__.py,sha256=ot4Q5ouLGe505DGFAxQP4p4yZLLaBLqbHmCF1OvHG1M,585
2
2
  usso/api_key.py,sha256=LtBY86HE27xTk-GCixTL2gyikuIV4XBYWY4OknjUgTk,1262
3
3
  usso/authorization.py,sha256=5cROjDZkmUs7eYav32h20WxOexucaF2d4i3_MuKhQ9A,8264
4
- usso/client.py,sha256=kN6RgYQv08jAiBJ6Z9O89LvWdN_3RXI7O-L89zzLVck,2650
5
- usso/config.py,sha256=zdiEFqfBhl6eAbfSXuoCZFsfiWBG0tnmozridxSIZ0E,3802
4
+ usso/client.py,sha256=GQXX9Ifxfrr7sSNMdj4IDWb8-JmkWshb0-TMhUmYCA8,3551
5
+ usso/config.py,sha256=okT-Z6M3u-URRsBAftpxF0ZO4tAfDZGH5pA6qCip0GM,3878
6
6
  usso/exceptions.py,sha256=hDxw475zvF55FTEqkfhZfciVXXGiB8pyWgqF2HiUiio,1743
7
7
  usso/user.py,sha256=uWL5fkD1QSV6H5qC690iS9MJWX5AvDze6c24l3sXvB0,3846
8
8
  usso/integrations/django/__init__.py,sha256=dKpbffHS5ouGtW6ooI2ivzjPmH_1rOBny85htR-KqrY,97
9
9
  usso/integrations/django/middleware.py,sha256=LEPb2LkGET47cgGpydcylfBabndX4Hycyzj-xdfREug,3453
10
10
  usso/integrations/fastapi/__init__.py,sha256=ohToiqutHu3Okr8naunssDkamj1OdiG4OpPdBW0rt7U,204
11
- usso/integrations/fastapi/dependency.py,sha256=u7jV3xAo3iW1_a8nu7c2Y2lrq5J8TN3PllYPXu-Oqos,2707
11
+ usso/integrations/fastapi/dependency.py,sha256=3ughk-H8yjxkH0fLjdBv-iw0hA3E84XfNs9dCv_2M-o,2833
12
12
  usso/integrations/fastapi/handler.py,sha256=FcYRWcYsiKNygjAWS1elcy_QQ6neCNsUEE8WyMDtMgA,501
13
13
  usso/session/__init__.py,sha256=tE4qWUdSI7iN_pywm47Mg8NKOTBa2nCNwCy3wCZWRmU,124
14
14
  usso/session/async_session.py,sha256=iu-bnZHe9_ODSXax_WsclJxtwZ9ClVt7KBl3RysYE-U,4073
@@ -16,9 +16,9 @@ usso/session/base_session.py,sha256=M35m_jBkdGHVPL4R3djuJDdE1aONZnoRvMv-FVrhyaU,
16
16
  usso/session/session.py,sha256=6f0zz1F_p4hbZgvCAdcMur__U_RaTsZ5R2658e1W-t8,1714
17
17
  usso/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  usso/utils/string_utils.py,sha256=7tziAa2Cwa7xhwM_NF4DSY3BHoqVaWgJ21VuV8LvhrY,253
19
- usso-0.28.27.dist-info/licenses/LICENSE.txt,sha256=ceC9ZJOV9H6CtQDcYmHOS46NA3dHJ_WD4J9blH513pc,1081
20
- usso-0.28.27.dist-info/METADATA,sha256=MscismYOkLXNAART0H5HHurMpAt2pf3ePanpJQizyHM,5061
21
- usso-0.28.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
- usso-0.28.27.dist-info/entry_points.txt,sha256=4Zgpm5ELaAWPf0jPGJFz1_X69H7un8ycT3WdGoJ0Vvk,35
23
- usso-0.28.27.dist-info/top_level.txt,sha256=g9Jf6h1Oyidh0vPiFni7UHInTJjSvu6cUalpLTIvthg,5
24
- usso-0.28.27.dist-info/RECORD,,
19
+ usso-0.28.28.dist-info/licenses/LICENSE.txt,sha256=ceC9ZJOV9H6CtQDcYmHOS46NA3dHJ_WD4J9blH513pc,1081
20
+ usso-0.28.28.dist-info/METADATA,sha256=Fh4LONujiTalgXOCgqHjvfv_3pLoeL-oQOJNB9Ucry4,5061
21
+ usso-0.28.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
+ usso-0.28.28.dist-info/entry_points.txt,sha256=4Zgpm5ELaAWPf0jPGJFz1_X69H7un8ycT3WdGoJ0Vvk,35
23
+ usso-0.28.28.dist-info/top_level.txt,sha256=g9Jf6h1Oyidh0vPiFni7UHInTJjSvu6cUalpLTIvthg,5
24
+ usso-0.28.28.dist-info/RECORD,,
File without changes