@@ -54,8 +54,8 @@ class OAuth2Core:
54
54
backend : BaseOAuth2 = None
55
55
_oauth_client : Optional [WebApplicationClient ] = None
56
56
57
- authorization_endpoint : str = None
58
- token_endpoint : str = None
57
+ _authorization_endpoint : str = None
58
+ _token_endpoint : str = None
59
59
60
60
def __init__ (self , client : OAuth2Client ) -> None :
61
61
self .client_id = client .client_id
@@ -65,8 +65,8 @@ def __init__(self, client: OAuth2Client) -> None:
65
65
self .provider = client .backend .name
66
66
self .redirect_uri = client .redirect_uri
67
67
self .backend = client .backend (OAuth2Strategy ())
68
- self .authorization_endpoint = client .backend .AUTHORIZATION_URL
69
- self .token_endpoint = client .backend .ACCESS_TOKEN_URL
68
+ self ._authorization_endpoint = client .backend .AUTHORIZATION_URL
69
+ self ._token_endpoint = client .backend .ACCESS_TOKEN_URL
70
70
self ._oauth_client = WebApplicationClient (self .client_id )
71
71
72
72
@property
@@ -76,19 +76,22 @@ def access_token(self) -> str:
76
76
def get_redirect_uri (self , request : Request ) -> str :
77
77
return urljoin (str (request .base_url ), "/oauth2/%s/token" % self .provider )
78
78
79
- async def login_redirect (self , request : Request ) -> RedirectResponse :
79
+ def authorization_url (self , request : Request ) -> str :
80
80
redirect_uri = self .get_redirect_uri (request )
81
81
state = "" .join ([random .choice (string .ascii_letters ) for _ in range (32 )])
82
82
83
83
oauth2_query_params = dict (state = state , scope = self .scope , redirect_uri = redirect_uri )
84
84
oauth2_query_params .update (request .query_params )
85
85
86
- return RedirectResponse ( str (self ._oauth_client .prepare_request_uri (
87
- self .authorization_endpoint ,
86
+ return str (self ._oauth_client .prepare_request_uri (
87
+ self ._authorization_endpoint ,
88
88
** oauth2_query_params ,
89
- )), 303 )
89
+ ))
90
90
91
- async def token_redirect (self , request : Request , ** httpx_client_args ) -> RedirectResponse :
91
+ def authorization_redirect (self , request : Request ) -> RedirectResponse :
92
+ return RedirectResponse (self .authorization_url (request ), 303 )
93
+
94
+ async def token_data (self , request : Request , ** httpx_client_args ) -> dict :
92
95
if not request .query_params .get ("code" ):
93
96
raise OAuth2LoginError (400 , "'code' parameter was not found in callback request" )
94
97
if not request .query_params .get ("state" ):
@@ -102,24 +105,22 @@ async def token_redirect(self, request: Request, **httpx_client_args) -> Redirec
102
105
oauth2_query_params .update (request .query_params )
103
106
104
107
token_url , headers , content = self ._oauth_client .prepare_token_request (
105
- self .token_endpoint ,
108
+ self ._token_endpoint ,
106
109
** oauth2_query_params ,
107
110
)
108
111
109
- headers .update ({
110
- "Accept" : "application/json" ,
111
- "Content-Type" : "application/x-www-form-urlencoded" ,
112
- })
112
+ headers .update ({"Accept" : "application/json" })
113
113
auth = httpx .BasicAuth (self .client_id , self .client_secret )
114
- async with httpx .AsyncClient (** httpx_client_args ) as session :
115
- response = await session .post (token_url , headers = headers , content = content , auth = auth )
114
+ async with httpx .AsyncClient (auth = auth , ** httpx_client_args ) as session :
115
+ response = await session .post (token_url , headers = headers , content = content )
116
116
try :
117
117
self ._oauth_client .parse_request_body_response (json .dumps (response .json ()))
118
- token_data = self .standardize (self .backend .user_data (self .access_token ))
119
- access_token = request .auth .jwt_create (token_data )
118
+ return self .standardize (self .backend .user_data (self .access_token ))
120
119
except (CustomOAuth2Error , Exception ) as e :
121
120
raise OAuth2LoginError (400 , str (e ))
122
121
122
+ async def token_redirect (self , request : Request , ** kwargs ) -> RedirectResponse :
123
+ access_token = request .auth .jwt_create (await self .token_data (request , ** kwargs ))
123
124
response = RedirectResponse (self .redirect_uri or request .base_url )
124
125
response .set_cookie (
125
126
"Authorization" ,
0 commit comments