Skip to content

Commit

Permalink
feat: exchange code for session now fully async (#378)
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Smith authored Nov 30, 2023
2 parents e6b3d46 + a249ba0 commit c294568
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 8 deletions.
19 changes: 11 additions & 8 deletions gotrue/_async/gotrue_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
AuthMFAUnenrollResponse,
AuthMFAVerifyResponse,
AuthResponse,
CodeExchangeParams,
DecodedJWTDict,
MFAChallengeAndVerifyParams,
MFAChallengeParams,
Expand Down Expand Up @@ -269,7 +270,7 @@ async def sign_in_with_oauth(
params["redirect_to"] = redirect_to
if scopes:
params["scopes"] = scopes
url = self._get_url_for_provider(provider, params)
url = await self._get_url_for_provider(provider, params)
return OAuthResponse(provider=provider, url=url)

async def sign_in_with_otp(
Expand Down Expand Up @@ -844,15 +845,17 @@ def _is_implicit_grant_flow(self, url: str) -> bool:
params = parse_qs(result.query)
return "access_token" in params or "error_description" in params

def _get_url_for_provider(
async def _get_url_for_provider(
self,
provider: Provider,
params: Dict[str, str],
) -> str:
if self._flow_type == "pkce":
code_verifier = generate_pkce_verifier()
code_challenge = generate_pkce_challenge(code_verifier)
self._storage.set_item(f"{self._storage_key}-code-verifier", code_verifier)
await self._storage.set_item(
f"{self._storage_key}-code-verifier", code_verifier
)
code_challenge_method = (
"plain" if code_verifier == code_challenge else "s256"
)
Expand All @@ -869,11 +872,11 @@ def _decode_jwt(self, jwt: str) -> DecodedJWTDict:
"""
return decode_jwt_payload(jwt)

def exchange_code_for_session(self, params: CodeExchangeParams):
code_verifier = params.get("code_verifier") or self._storage.get_item(
async def exchange_code_for_session(self, params: CodeExchangeParams):
code_verifier = params.get("code_verifier") or await self._storage.get_item(
f"{self._storage_key}-code-verifier"
)
response = self._request(
response = await self._request(
"POST",
"token?grant_type=pkce",
body={
Expand All @@ -883,8 +886,8 @@ def exchange_code_for_session(self, params: CodeExchangeParams):
redirect_to=params.get("redirect_to"),
xform=parse_auth_response,
)
self._storage.remove_item(f"{self._storage_key}-code-verifier")
await self._storage.remove_item(f"{self._storage_key}-code-verifier")
if response.session:
self._save_session(response.session)
await self._save_session(response.session)
self._notify_all_subscribers("SIGNED_IN", response.session)
return response
1 change: 1 addition & 0 deletions gotrue/_sync/gotrue_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
AuthMFAUnenrollResponse,
AuthMFAVerifyResponse,
AuthResponse,
CodeExchangeParams,
DecodedJWTDict,
MFAChallengeAndVerifyParams,
MFAChallengeParams,
Expand Down

0 comments on commit c294568

Please sign in to comment.