1- """SSO login base dependency
2- """
3- # pylint: disable=too-few-public-methods
1+ """SSO login base dependency"""
42
53import json
64import sys
75import warnings
86from typing import Any , Dict , List , Optional
97
108import httpx
11- import pydantic
129from oauthlib .oauth2 import WebApplicationClient
1310from starlette .exceptions import HTTPException
1411from starlette .requests import Request
@@ -34,19 +31,6 @@ class SSOLoginError(HTTPException):
3431 """
3532
3633
37- class OpenID (pydantic .BaseModel ): # pylint: disable=no-member
38- """Class (schema) to represent information got from sso provider in a common form."""
39-
40- id : Optional [str ] = None
41- email : Optional [str ] = None
42- first_name : Optional [str ] = None
43- last_name : Optional [str ] = None
44- display_name : Optional [str ] = None
45- picture : Optional [str ] = None
46- provider : Optional [str ] = None
47-
48-
49- # pylint: disable=too-many-instance-attributes
5034class SSOBase :
5135 """Base class (mixin) for all SSO providers"""
5236
@@ -59,15 +43,14 @@ class SSOBase:
5943 additional_headers : Optional [Dict [str , Any ]] = None
6044
6145 def __init__ (
62- self ,
63- client_id : str ,
64- client_secret : str ,
65- redirect_uri : Optional [str ] = None ,
66- allow_insecure_http : bool = False ,
67- use_state : bool = False ,
68- scope : Optional [List [str ]] = None ,
46+ self ,
47+ client_id : str ,
48+ client_secret : str ,
49+ redirect_uri : Optional [str ] = None ,
50+ allow_insecure_http : bool = False ,
51+ use_state : bool = False ,
52+ scope : Optional [List [str ]] = None ,
6953 ):
70- # pylint: disable=too-many-arguments
7154 self .client_id = client_id
7255 self .client_secret = client_secret
7356 self .redirect_uri = redirect_uri
@@ -116,8 +99,8 @@ def refresh_token(self) -> Optional[str]:
11699 return self ._refresh_token or self .oauth_client .refresh_token
117100
118101 @classmethod
119- async def openid_from_response (cls , response : dict ) -> OpenID :
120- """Return {OpenID } object from provider's user info endpoint response"""
102+ async def openid_from_response (cls , response : dict ) -> dict :
103+ """Return {dict } object from provider's user info endpoint response"""
121104 raise NotImplementedError (f"Provider { cls .provider } not supported" )
122105
123106 async def get_discovery_document (self ) -> DiscoveryDocument :
@@ -143,11 +126,11 @@ async def userinfo_endpoint(self) -> Optional[str]:
143126 return discovery .get ("userinfo_endpoint" )
144127
145128 async def get_login_url (
146- self ,
147- * ,
148- redirect_uri : Optional [str ] = None ,
149- params : Optional [Dict [str , Any ]] = None ,
150- state : Optional [str ] = None ,
129+ self ,
130+ * ,
131+ redirect_uri : Optional [str ] = None ,
132+ params : Optional [Dict [str , Any ]] = None ,
133+ state : Optional [str ] = None ,
151134 ) -> str :
152135 """Return prepared login url. This is low-level, see {get_login_redirect} instead."""
153136 params = params or {}
@@ -160,11 +143,11 @@ async def get_login_url(
160143 return request_uri
161144
162145 async def get_login_redirect (
163- self ,
164- * ,
165- redirect_uri : Optional [str ] = None ,
166- params : Optional [Dict [str , Any ]] = None ,
167- state : Optional [str ] = None ,
146+ self ,
147+ * ,
148+ redirect_uri : Optional [str ] = None ,
149+ params : Optional [Dict [str , Any ]] = None ,
150+ state : Optional [str ] = None ,
168151 ) -> RedirectResponse :
169152 """Return redirect response by Stalette to login page of Oauth SSO provider
170153
@@ -182,13 +165,13 @@ async def get_login_redirect(
182165 return response
183166
184167 async def verify_and_process (
185- self ,
186- request : Request ,
187- * ,
188- params : Optional [Dict [str , Any ]] = None ,
189- headers : Optional [Dict [str , Any ]] = None ,
190- redirect_uri : Optional [str ] = None ,
191- ) -> Optional [OpenID ]:
168+ self ,
169+ request : Request ,
170+ * ,
171+ params : Optional [Dict [str , Any ]] = None ,
172+ headers : Optional [Dict [str , Any ]] = None ,
173+ redirect_uri : Optional [str ] = None ,
174+ ) -> Optional [dict ]:
192175 """Get FastAPI (Starlette) Request object and process login.
193176 This handler should be used for your /callback path.
194177
@@ -197,7 +180,7 @@ async def verify_and_process(
197180 params {Optional[Dict[str, Any]]} -- Optional additional query parameters to pass to the provider
198181
199182 Returns:
200- Optional[OpenID ] -- OpenID if the login was successfull
183+ Optional[dict ] -- dict if the login was successfully
201184 """
202185 headers = headers or {}
203186 code = request .query_params .get ("code" )
@@ -209,22 +192,21 @@ async def verify_and_process(
209192 )
210193
211194 async def process_login (
212- self ,
213- code : str ,
214- request : Request ,
215- * ,
216- params : Optional [Dict [str , Any ]] = None ,
217- additional_headers : Optional [Dict [str , Any ]] = None ,
218- redirect_uri : Optional [str ] = None ,
219- ) -> Optional [OpenID ]:
195+ self ,
196+ code : str ,
197+ request : Request ,
198+ * ,
199+ params : Optional [Dict [str , Any ]] = None ,
200+ additional_headers : Optional [Dict [str , Any ]] = None ,
201+ redirect_uri : Optional [str ] = None ,
202+ ) -> Optional [dict ]:
220203 """This method should be called from callback endpoint to verify the user and request user info endpoint.
221204 This is low level, you should use {verify_and_process} instead.
222205
223206 Arguments:
224207 params {Optional[Dict[str, Any]]} -- Optional additional query parameters to pass to the provider
225208 additional_headers {Optional[Dict[str, Any]]} -- Optional additional headers to be added to all requests
226209 """
227- # pylint: disable=too-many-locals
228210 params = params or {}
229211 additional_headers = additional_headers or {}
230212 additional_headers .update (self .additional_headers or {})
0 commit comments