Skip to content

Commit 57ec6d8

Browse files
feat: add create user param to sign in (#75)
* feat: add create user param to sign in ref: supabase/auth#318 * 'Refactored by Sourcery' (#76) Co-authored-by: Sourcery AI <> * chore: format code * chore: format code Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
1 parent c6d4d09 commit 57ec6d8

File tree

4 files changed

+64
-56
lines changed

4 files changed

+64
-56
lines changed

gotrue/_async/api.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ async def send_magic_link_email(
248248
self,
249249
*,
250250
email: str,
251+
create_user: bool,
251252
redirect_to: Optional[str] = None,
252253
) -> None:
253254
"""Sends a magic login link to an email address.
@@ -269,12 +270,12 @@ async def send_magic_link_email(
269270
if redirect_to:
270271
redirect_to_encoded = encode_uri_component(redirect_to)
271272
query_string = f"?redirect_to={redirect_to_encoded}"
272-
data = {"email": email}
273+
data = {"email": email, "create_user": create_user}
273274
url = f"{self.url}/magiclink{query_string}"
274275
response = await self.http_client.post(url, json=data, headers=headers)
275276
return check_response(response)
276277

277-
async def send_mobile_otp(self, *, phone: str) -> None:
278+
async def send_mobile_otp(self, *, phone: str, create_user: bool) -> None:
278279
"""Sends a mobile OTP via SMS. Will register the account if it doesn't already exist
279280
280281
Parameters
@@ -288,7 +289,7 @@ async def send_mobile_otp(self, *, phone: str) -> None:
288289
If an error occurs
289290
"""
290291
headers = self.headers
291-
data = {"phone": phone}
292+
data = {"phone": phone, "create_user": create_user}
292293
url = f"{self.url}/otp"
293294
response = await self.http_client.post(url, json=data, headers=headers)
294295
return check_response(response)

gotrue/_async/client.py

+29-25
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(
7171
"headers": {**empty_or_default_headers, **headers},
7272
"cookie_options": cookie_options,
7373
}
74-
self.api = api if api else AsyncGoTrueAPI(**args)
74+
self.api = api or AsyncGoTrueAPI(**args)
7575

7676
async def __aenter__(self) -> AsyncGoTrueClient:
7777
return self
@@ -158,6 +158,7 @@ async def sign_in(
158158
provider: Optional[Provider] = None,
159159
redirect_to: Optional[str] = None,
160160
scopes: Optional[str] = None,
161+
create_user: bool = False,
161162
) -> Optional[Union[Session, str]]:
162163
"""Log in an existing user, or login via a third-party provider.
163164
If email and phone are provided, email will be used and phone will be ignored.
@@ -204,18 +205,26 @@ async def sign_in(
204205
If an error occurs
205206
"""
206207
await self._remove_session()
207-
if email and not password:
208-
response = await self.api.send_magic_link_email(email=email)
209-
elif email and password:
210-
response = await self._handle_email_sign_in(
211-
email=email,
212-
password=password,
213-
redirect_to=redirect_to,
214-
)
215-
elif phone and not password:
216-
response = await self.api.send_mobile_otp(phone=phone)
217-
elif phone and password:
218-
response = await self._handle_phone_sign_in(phone=phone, password=password)
208+
if email:
209+
if password:
210+
response = await self._handle_email_sign_in(
211+
email=email,
212+
password=password,
213+
redirect_to=redirect_to,
214+
)
215+
else:
216+
response = await self.api.send_magic_link_email(
217+
email=email, create_user=create_user
218+
)
219+
elif phone:
220+
if password:
221+
response = await self._handle_phone_sign_in(
222+
phone=phone, password=password
223+
)
224+
else:
225+
response = await self.api.send_mobile_otp(
226+
phone=phone, create_user=create_user
227+
)
219228
elif refresh_token:
220229
# current_session and current_user will be updated to latest
221230
# on _call_refresh_token using the passed refresh_token
@@ -290,8 +299,7 @@ async def refresh_session(self) -> Session:
290299
"""
291300
if not self.current_session:
292301
raise ValueError("Not logged in.")
293-
response = await self._call_refresh_token()
294-
return response
302+
return await self._call_refresh_token()
295303

296304
async def update(self, *, attributes: UserAttributes) -> User:
297305
"""Updates user data, if there is a logged in user.
@@ -523,12 +531,11 @@ async def _handle_provider_sign_in(
523531
scopes: Optional[str],
524532
) -> str:
525533
"""Sign in with provider."""
526-
response = await self.api.get_url_for_provider(
534+
return await self.api.get_url_for_provider(
527535
provider=provider,
528536
redirect_to=redirect_to,
529537
scopes=scopes,
530538
)
531-
return response
532539

533540
async def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
534541
"""Recover common logic"""
@@ -565,15 +572,12 @@ async def _recover_and_refresh(self) -> None:
565572
if not result:
566573
return
567574
session, expires_at, time_now = result
568-
if expires_at < time_now:
569-
if self.auto_refresh_token and session.refresh_token:
570-
try:
571-
await self._call_refresh_token(refresh_token=session.refresh_token)
572-
except APIError:
573-
await self._remove_session()
574-
else:
575+
if expires_at < time_now and self.auto_refresh_token and session.refresh_token:
576+
try:
577+
await self._call_refresh_token(refresh_token=session.refresh_token)
578+
except APIError:
575579
await self._remove_session()
576-
elif not session or not session.user:
580+
elif expires_at < time_now or not session or not session.user:
577581
await self._remove_session()
578582
else:
579583
await self._save_session(session=session)

gotrue/_sync/api.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ def send_magic_link_email(
248248
self,
249249
*,
250250
email: str,
251+
create_user: bool,
251252
redirect_to: Optional[str] = None,
252253
) -> None:
253254
"""Sends a magic login link to an email address.
@@ -269,12 +270,12 @@ def send_magic_link_email(
269270
if redirect_to:
270271
redirect_to_encoded = encode_uri_component(redirect_to)
271272
query_string = f"?redirect_to={redirect_to_encoded}"
272-
data = {"email": email}
273+
data = {"email": email, "create_user": create_user}
273274
url = f"{self.url}/magiclink{query_string}"
274275
response = self.http_client.post(url, json=data, headers=headers)
275276
return check_response(response)
276277

277-
def send_mobile_otp(self, *, phone: str) -> None:
278+
def send_mobile_otp(self, *, phone: str, create_user: bool) -> None:
278279
"""Sends a mobile OTP via SMS. Will register the account if it doesn't already exist
279280
280281
Parameters
@@ -288,7 +289,7 @@ def send_mobile_otp(self, *, phone: str) -> None:
288289
If an error occurs
289290
"""
290291
headers = self.headers
291-
data = {"phone": phone}
292+
data = {"phone": phone, "create_user": create_user}
292293
url = f"{self.url}/otp"
293294
response = self.http_client.post(url, json=data, headers=headers)
294295
return check_response(response)

gotrue/_sync/client.py

+27-25
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(
7171
"headers": {**empty_or_default_headers, **headers},
7272
"cookie_options": cookie_options,
7373
}
74-
self.api = api if api else SyncGoTrueAPI(**args)
74+
self.api = api or SyncGoTrueAPI(**args)
7575

7676
def __enter__(self) -> SyncGoTrueClient:
7777
return self
@@ -158,6 +158,7 @@ def sign_in(
158158
provider: Optional[Provider] = None,
159159
redirect_to: Optional[str] = None,
160160
scopes: Optional[str] = None,
161+
create_user: bool = False,
161162
) -> Optional[Union[Session, str]]:
162163
"""Log in an existing user, or login via a third-party provider.
163164
If email and phone are provided, email will be used and phone will be ignored.
@@ -204,18 +205,24 @@ def sign_in(
204205
If an error occurs
205206
"""
206207
self._remove_session()
207-
if email and not password:
208-
response = self.api.send_magic_link_email(email=email)
209-
elif email and password:
210-
response = self._handle_email_sign_in(
211-
email=email,
212-
password=password,
213-
redirect_to=redirect_to,
214-
)
215-
elif phone and not password:
216-
response = self.api.send_mobile_otp(phone=phone)
217-
elif phone and password:
218-
response = self._handle_phone_sign_in(phone=phone, password=password)
208+
if email:
209+
if password:
210+
response = self._handle_email_sign_in(
211+
email=email,
212+
password=password,
213+
redirect_to=redirect_to,
214+
)
215+
else:
216+
response = self.api.send_magic_link_email(
217+
email=email, create_user=create_user
218+
)
219+
elif phone:
220+
if password:
221+
response = self._handle_phone_sign_in(phone=phone, password=password)
222+
else:
223+
response = self.api.send_mobile_otp(
224+
phone=phone, create_user=create_user
225+
)
219226
elif refresh_token:
220227
# current_session and current_user will be updated to latest
221228
# on _call_refresh_token using the passed refresh_token
@@ -290,8 +297,7 @@ def refresh_session(self) -> Session:
290297
"""
291298
if not self.current_session:
292299
raise ValueError("Not logged in.")
293-
response = self._call_refresh_token()
294-
return response
300+
return self._call_refresh_token()
295301

296302
def update(self, *, attributes: UserAttributes) -> User:
297303
"""Updates user data, if there is a logged in user.
@@ -523,12 +529,11 @@ def _handle_provider_sign_in(
523529
scopes: Optional[str],
524530
) -> str:
525531
"""Sign in with provider."""
526-
response = self.api.get_url_for_provider(
532+
return self.api.get_url_for_provider(
527533
provider=provider,
528534
redirect_to=redirect_to,
529535
scopes=scopes,
530536
)
531-
return response
532537

533538
def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
534539
"""Recover common logic"""
@@ -565,15 +570,12 @@ def _recover_and_refresh(self) -> None:
565570
if not result:
566571
return
567572
session, expires_at, time_now = result
568-
if expires_at < time_now:
569-
if self.auto_refresh_token and session.refresh_token:
570-
try:
571-
self._call_refresh_token(refresh_token=session.refresh_token)
572-
except APIError:
573-
self._remove_session()
574-
else:
573+
if expires_at < time_now and self.auto_refresh_token and session.refresh_token:
574+
try:
575+
self._call_refresh_token(refresh_token=session.refresh_token)
576+
except APIError:
575577
self._remove_session()
576-
elif not session or not session.user:
578+
elif expires_at < time_now or not session or not session.user:
577579
self._remove_session()
578580
else:
579581
self._save_session(session=session)

0 commit comments

Comments
 (0)