1+ from collections .abc import Iterator
2+ from contextlib import contextmanager
13from os import environ as env
24from typing import Optional
35from urllib .parse import urlparse
79
810from uipath .platform .constants import ENV_BASE_URL
911
12+ from ..common .auth import TokenData
1013from ..errors import EnrichedException
1114from ..identity import IdentityService
12- from .auth import TokenData
1315
1416
1517class ExternalApplicationService :
@@ -72,6 +74,31 @@ def _extract_environment_from_base_url(self, base_url: str) -> str:
7274 # Default to cloud if parsing fails
7375 return "cloud"
7476
77+ @contextmanager
78+ def _translate_auth_errors (self ) -> Iterator [None ]:
79+ """Translate token acquisition failures into authentication errors."""
80+ try :
81+ yield
82+ except HTTPStatusError as e :
83+ match e .response .status_code :
84+ case 400 :
85+ message = "Invalid client credentials or request parameters."
86+ case 401 :
87+ message = "Unauthorized: Invalid client credentials."
88+ case _:
89+ message = f"Authentication failed with unexpected status: { e .response .status_code } "
90+ raise EnrichedException (
91+ HTTPStatusError (
92+ message = message ,
93+ request = e .request ,
94+ response = e .response ,
95+ )
96+ ) from e
97+ except httpx .RequestError as e :
98+ raise Exception (f"Network error during authentication: { e } " ) from e
99+ except Exception as e :
100+ raise Exception (f"Unexpected error during authentication: { e } " ) from e
101+
75102 def get_token_data (
76103 self , client_id : str , client_secret : str , scope : Optional [str ] = "OR.Execution"
77104 ) -> TokenData :
@@ -85,42 +112,12 @@ def get_token_data(
85112 Returns:
86113 Token data if successful
87114 """
88- try :
115+ with self . _translate_auth_errors () :
89116 return self ._identity_service .get_client_credentials_token (
90117 client_id = client_id ,
91118 client_secret = client_secret ,
92119 scope = scope ,
93120 )
94- except HTTPStatusError as e :
95- match e .response .status_code :
96- case 400 :
97- raise EnrichedException (
98- HTTPStatusError (
99- message = "Invalid client credentials or request parameters." ,
100- request = e .request ,
101- response = e .response ,
102- )
103- ) from e
104- case 401 :
105- raise EnrichedException (
106- HTTPStatusError (
107- message = "Unauthorized: Invalid client credentials." ,
108- request = e .request ,
109- response = e .response ,
110- )
111- ) from e
112- case _:
113- raise EnrichedException (
114- HTTPStatusError (
115- message = f"Authentication failed with unexpected status: { e .response .status_code } " ,
116- request = e .request ,
117- response = e .response ,
118- )
119- ) from e
120- except httpx .RequestError as e :
121- raise Exception (f"Network error during authentication: { e } " ) from e
122- except Exception as e :
123- raise Exception (f"Unexpected error during authentication: { e } " ) from e
124121
125122 async def get_token_data_async (
126123 self , client_id : str , client_secret : str , scope : Optional [str ] = "OR.Execution"
@@ -135,39 +132,9 @@ async def get_token_data_async(
135132 Returns:
136133 Token data if successful
137134 """
138- try :
135+ with self . _translate_auth_errors () :
139136 return await self ._identity_service .get_client_credentials_token_async (
140137 client_id = client_id ,
141138 client_secret = client_secret ,
142139 scope = scope ,
143140 )
144- except HTTPStatusError as e :
145- match e .response .status_code :
146- case 400 :
147- raise EnrichedException (
148- HTTPStatusError (
149- message = "Invalid client credentials or request parameters." ,
150- request = e .request ,
151- response = e .response ,
152- )
153- ) from e
154- case 401 :
155- raise EnrichedException (
156- HTTPStatusError (
157- message = "Unauthorized: Invalid client credentials." ,
158- request = e .request ,
159- response = e .response ,
160- )
161- ) from e
162- case _:
163- raise EnrichedException (
164- HTTPStatusError (
165- message = f"Authentication failed with unexpected status: { e .response .status_code } " ,
166- request = e .request ,
167- response = e .response ,
168- )
169- ) from e
170- except httpx .RequestError as e :
171- raise Exception (f"Network error during authentication: { e } " ) from e
172- except Exception as e :
173- raise Exception (f"Unexpected error during authentication: { e } " ) from e
0 commit comments