Skip to content

Commit aed3fae

Browse files
committed
Segregate the redirects from the results
1 parent 0be90fb commit aed3fae

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

src/fastapi_oauth2/core.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ class OAuth2Core:
5454
backend: BaseOAuth2 = None
5555
_oauth_client: Optional[WebApplicationClient] = None
5656

57-
authorization_endpoint: str = None
58-
token_endpoint: str = None
57+
_authorization_endpoint: str = None
58+
_token_endpoint: str = None
5959

6060
def __init__(self, client: OAuth2Client) -> None:
6161
self.client_id = client.client_id
@@ -65,8 +65,8 @@ def __init__(self, client: OAuth2Client) -> None:
6565
self.provider = client.backend.name
6666
self.redirect_uri = client.redirect_uri
6767
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
7070
self._oauth_client = WebApplicationClient(self.client_id)
7171

7272
@property
@@ -76,19 +76,22 @@ def access_token(self) -> str:
7676
def get_redirect_uri(self, request: Request) -> str:
7777
return urljoin(str(request.base_url), "/oauth2/%s/token" % self.provider)
7878

79-
async def login_redirect(self, request: Request) -> RedirectResponse:
79+
def authorization_url(self, request: Request) -> str:
8080
redirect_uri = self.get_redirect_uri(request)
8181
state = "".join([random.choice(string.ascii_letters) for _ in range(32)])
8282

8383
oauth2_query_params = dict(state=state, scope=self.scope, redirect_uri=redirect_uri)
8484
oauth2_query_params.update(request.query_params)
8585

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,
8888
**oauth2_query_params,
89-
)), 303)
89+
))
9090

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:
9295
if not request.query_params.get("code"):
9396
raise OAuth2LoginError(400, "'code' parameter was not found in callback request")
9497
if not request.query_params.get("state"):
@@ -102,24 +105,22 @@ async def token_redirect(self, request: Request, **httpx_client_args) -> Redirec
102105
oauth2_query_params.update(request.query_params)
103106

104107
token_url, headers, content = self._oauth_client.prepare_token_request(
105-
self.token_endpoint,
108+
self._token_endpoint,
106109
**oauth2_query_params,
107110
)
108111

109-
headers.update({
110-
"Accept": "application/json",
111-
"Content-Type": "application/x-www-form-urlencoded",
112-
})
112+
headers.update({"Accept": "application/json"})
113113
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)
116116
try:
117117
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))
120119
except (CustomOAuth2Error, Exception) as e:
121120
raise OAuth2LoginError(400, str(e))
122121

122+
async def token_redirect(self, request: Request, **kwargs) -> RedirectResponse:
123+
access_token = request.auth.jwt_create(await self.token_data(request, **kwargs))
123124
response = RedirectResponse(self.redirect_uri or request.base_url)
124125
response.set_cookie(
125126
"Authorization",

0 commit comments

Comments
 (0)