8
8
import sys
9
9
import warnings
10
10
from types import TracebackType
11
- from typing import Any , Dict , List , Optional , Type , Union
11
+ from typing import Any , Dict , List , Literal , Optional , Type , Union , overload
12
12
13
13
import httpx
14
14
import pydantic
@@ -296,14 +296,37 @@ async def get_login_redirect(
296
296
response .set_cookie ("pkce_code_verifier" , str (self ._pkce_code_verifier ))
297
297
return response
298
298
299
+ @overload
299
300
async def verify_and_process (
300
301
self ,
301
302
request : Request ,
302
303
* ,
303
304
params : Optional [Dict [str , Any ]] = None ,
304
305
headers : Optional [Dict [str , Any ]] = None ,
305
306
redirect_uri : Optional [str ] = None ,
306
- ) -> Optional [OpenID ]:
307
+ convert_response : Literal [True ] = True ,
308
+ ) -> Optional [OpenID ]: ...
309
+
310
+ @overload
311
+ async def verify_and_process (
312
+ self ,
313
+ request : Request ,
314
+ * ,
315
+ params : Optional [Dict [str , Any ]] = None ,
316
+ headers : Optional [Dict [str , Any ]] = None ,
317
+ redirect_uri : Optional [str ] = None ,
318
+ convert_response : Literal [False ],
319
+ ) -> Optional [Dict [str , Any ]]: ...
320
+
321
+ async def verify_and_process (
322
+ self ,
323
+ request : Request ,
324
+ * ,
325
+ params : Optional [Dict [str , Any ]] = None ,
326
+ headers : Optional [Dict [str , Any ]] = None ,
327
+ redirect_uri : Optional [str ] = None ,
328
+ convert_response : Union [Literal [True ], Literal [False ]] = True ,
329
+ ) -> Union [Optional [OpenID ], Optional [Dict [str , Any ]]]:
307
330
"""
308
331
Processes the login given a FastAPI (Starlette) Request object. This should be used for the /callback path.
309
332
@@ -312,12 +335,14 @@ async def verify_and_process(
312
335
params (Optional[Dict[str, Any]]): Additional query parameters to pass to the provider.
313
336
headers (Optional[Dict[str, Any]]): Additional headers to pass to the provider.
314
337
redirect_uri (Optional[str]): Overrides the `redirect_uri` specified on this instance.
338
+ convert_response (bool): If True, userinfo response is converted to OpenID object.
315
339
316
340
Raises:
317
341
SSOLoginError: If the 'code' parameter is not found in the callback request.
318
342
319
343
Returns:
320
- Optional[OpenID]: User information in OpenID format if the login was successful.
344
+ Optional[OpenID]: User information as OpenID instance (if convert_response == True)
345
+ Optional[Dict[str, Any]]: The original JSON response from the API.
321
346
"""
322
347
headers = headers or {}
323
348
code = request .query_params .get ("code" )
@@ -338,6 +363,7 @@ async def verify_and_process(
338
363
additional_headers = headers ,
339
364
redirect_uri = redirect_uri ,
340
365
pkce_code_verifier = pkce_code_verifier ,
366
+ convert_response = convert_response ,
341
367
)
342
368
343
369
def __enter__ (self ) -> "SSOBase" :
@@ -363,6 +389,7 @@ def __exit__(
363
389
def _extra_query_params (self ) -> Dict :
364
390
return {}
365
391
392
+ @overload
366
393
async def process_login (
367
394
self ,
368
395
code : str ,
@@ -372,7 +399,33 @@ async def process_login(
372
399
additional_headers : Optional [Dict [str , Any ]] = None ,
373
400
redirect_uri : Optional [str ] = None ,
374
401
pkce_code_verifier : Optional [str ] = None ,
375
- ) -> Optional [OpenID ]:
402
+ convert_response : Literal [True ] = True ,
403
+ ) -> Optional [OpenID ]: ...
404
+
405
+ @overload
406
+ async def process_login (
407
+ self ,
408
+ code : str ,
409
+ request : Request ,
410
+ * ,
411
+ params : Optional [Dict [str , Any ]] = None ,
412
+ additional_headers : Optional [Dict [str , Any ]] = None ,
413
+ redirect_uri : Optional [str ] = None ,
414
+ pkce_code_verifier : Optional [str ] = None ,
415
+ convert_response : Literal [False ],
416
+ ) -> Optional [Dict [str , Any ]]: ...
417
+
418
+ async def process_login (
419
+ self ,
420
+ code : str ,
421
+ request : Request ,
422
+ * ,
423
+ params : Optional [Dict [str , Any ]] = None ,
424
+ additional_headers : Optional [Dict [str , Any ]] = None ,
425
+ redirect_uri : Optional [str ] = None ,
426
+ pkce_code_verifier : Optional [str ] = None ,
427
+ convert_response : Union [Literal [True ], Literal [False ]] = True ,
428
+ ) -> Union [Optional [OpenID ], Optional [Dict [str , Any ]]]:
376
429
"""
377
430
Processes login from the callback endpoint to verify the user and request user info endpoint.
378
431
It's a lower-level method, typically, you should use `verify_and_process` instead.
@@ -384,12 +437,14 @@ async def process_login(
384
437
additional_headers (Optional[Dict[str, Any]]): Additional headers to be added to all requests.
385
438
redirect_uri (Optional[str]): Overrides the `redirect_uri` specified on this instance.
386
439
pkce_code_verifier (Optional[str]): A PKCE code verifier sent to the server to verify the login request.
440
+ convert_response (bool): If True, userinfo response is converted to OpenID object.
387
441
388
442
Raises:
389
443
ReusedOauthClientWarning: If the SSO object is reused, which is not safe and caused security issues.
390
444
391
445
Returns:
392
- Optional[OpenID]: User information in OpenID format if the login was successful.
446
+ Optional[OpenID]: User information in OpenID format if the login was successful (convert_response == True).
447
+ Optional[Dict[str, Any]]: Original userinfo API endpoint response.
393
448
"""
394
449
# pylint: disable=too-many-locals
395
450
if self ._oauth_client is not None : # pragma: no cover
@@ -447,5 +502,6 @@ async def process_login(
447
502
session .headers .update (headers )
448
503
response = await session .get (uri )
449
504
content = response .json ()
450
-
451
- return await self .openid_from_response (content , session )
505
+ if convert_response :
506
+ return await self .openid_from_response (content , session )
507
+ return content
0 commit comments