99from starlette .requests import Request
1010from starlette .responses import RedirectResponse
1111
12+ from .config import JWT_EXPIRES , OAUTH2_REDIRECT_URL
13+ from .utils import create_access_token
1214
13- class SSOLoginError (HTTPException ):
15+
16+ class OAuth2LoginError (HTTPException ):
1417 """Raised when any login-related error occurs
1518 (such as when user is not verified or if there was an attempt for fake login)
1619 """
1720
1821
19- class SSOBase :
22+ class OAuth2Base :
2023 """Base class (mixin) for all SSO providers"""
2124
2225 client_id : str = None
@@ -78,7 +81,7 @@ async def get_login_url(
7881 self .authorization_endpoint , redirect_uri = redirect_uri , state = state , scope = self .scope , ** params
7982 )
8083
81- async def get_login_redirect (
84+ async def login_redirect (
8285 self ,
8386 * ,
8487 redirect_uri : Optional [str ] = None ,
@@ -88,7 +91,7 @@ async def get_login_redirect(
8891 login_uri = await self .get_login_url (redirect_uri = redirect_uri , params = params , state = state )
8992 return RedirectResponse (login_uri , 303 )
9093
91- async def verify_and_process (
94+ async def get_token_data (
9295 self ,
9396 request : Request ,
9497 * ,
@@ -100,9 +103,9 @@ async def verify_and_process(
100103 additional_headers = headers or {}
101104 additional_headers .update (self .additional_headers or {})
102105 if not request .query_params .get ("code" ):
103- raise SSOLoginError (400 , "'code' parameter was not found in callback request" )
106+ raise OAuth2LoginError (400 , "'code' parameter was not found in callback request" )
104107 if self .state != request .query_params .get ("state" ):
105- raise SSOLoginError (400 , "'state' parameter does not match" )
108+ raise OAuth2LoginError (400 , "'state' parameter does not match" )
106109
107110 url = request .url
108111 scheme = "http" if self .allow_insecure_http else "https"
@@ -129,3 +132,23 @@ async def verify_and_process(
129132 content = response .json ()
130133
131134 return content
135+
136+ async def token_redirect (
137+ self ,
138+ request : Request ,
139+ * ,
140+ params : Optional [Dict [str , Any ]] = None ,
141+ headers : Optional [Dict [str , Any ]] = None ,
142+ redirect_uri : Optional [str ] = None ,
143+ ) -> RedirectResponse :
144+ token_data = await self .get_token_data (request , params = params , headers = headers , redirect_uri = redirect_uri )
145+ access_token = create_access_token (token_data )
146+ response = RedirectResponse (OAUTH2_REDIRECT_URL )
147+ response .set_cookie (
148+ "Authorization" ,
149+ value = f"Bearer { access_token } " ,
150+ httponly = self .allow_insecure_http ,
151+ max_age = JWT_EXPIRES * 60 ,
152+ expires = JWT_EXPIRES * 60 ,
153+ )
154+ return response
0 commit comments