From 987adf2c112398be252d1fd9563cc8763dfc0b6f Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Sun, 31 Dec 2023 00:16:16 +0800 Subject: [PATCH 1/8] fix: add linking methods --- gotrue/_async/gotrue_client.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index 06be518d..d530f75a 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -274,6 +274,25 @@ async def sign_in_with_oauth( url = await self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + async def link_identity(credentials): + redirect_to = options.get("redirect_to") + scopes = options.get("scopes") + params = options.get("query_params", {}) + if redirect_to: + params["redirect_to"] = redirect_to + if scopes: + params["scopes"] = scopes + params["skip_browser_redirect"] = True + + url = await self._get_url_for_provider(provider, params) + return OAuthResponse(provider=provider, url=url) + + async def unlink_identity(identity): + return await self._request( + "POST", + f"/user/identities/{identity.identity_id}", + ) + async def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, From 7c9f642c9a6448707683fe6b54d3be4102aa8506 Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Sun, 31 Dec 2023 00:17:36 +0800 Subject: [PATCH 2/8] feat: add sync methods --- gotrue/_sync/gotrue_client.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index 4c270bc4..30aa10b0 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -274,6 +274,25 @@ def sign_in_with_oauth( url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + def link_identity(credentials): + redirect_to = options.get("redirect_to") + scopes = options.get("scopes") + params = options.get("query_params", {}) + if redirect_to: + params["redirect_to"] = redirect_to + if scopes: + params["scopes"] = scopes + params["skip_browser_redirect"] = True + + url = self._get_url_for_provider(provider, params) + return OAuthResponse(provider=provider, url=url) + + def unlink_identity(identity): + return self._request( + "POST", + f"/user/identities/{identity.identity_id}", + ) + def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, From a29083a840200d984e9b969569eeb16185e5b598 Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Sun, 31 Dec 2023 00:16:16 +0800 Subject: [PATCH 3/8] fix: add linking methods --- gotrue/_async/gotrue_client.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index 06be518d..d530f75a 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -274,6 +274,25 @@ async def sign_in_with_oauth( url = await self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + async def link_identity(credentials): + redirect_to = options.get("redirect_to") + scopes = options.get("scopes") + params = options.get("query_params", {}) + if redirect_to: + params["redirect_to"] = redirect_to + if scopes: + params["scopes"] = scopes + params["skip_browser_redirect"] = True + + url = await self._get_url_for_provider(provider, params) + return OAuthResponse(provider=provider, url=url) + + async def unlink_identity(identity): + return await self._request( + "POST", + f"/user/identities/{identity.identity_id}", + ) + async def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, From 280dc406c4e031b6c4681c56a36a9c9ddefd15d9 Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Sun, 31 Dec 2023 00:17:36 +0800 Subject: [PATCH 4/8] feat: add sync methods --- gotrue/_sync/gotrue_client.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index 4c270bc4..30aa10b0 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -274,6 +274,25 @@ def sign_in_with_oauth( url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + def link_identity(credentials): + redirect_to = options.get("redirect_to") + scopes = options.get("scopes") + params = options.get("query_params", {}) + if redirect_to: + params["redirect_to"] = redirect_to + if scopes: + params["scopes"] = scopes + params["skip_browser_redirect"] = True + + url = self._get_url_for_provider(provider, params) + return OAuthResponse(provider=provider, url=url) + + def unlink_identity(identity): + return self._request( + "POST", + f"/user/identities/{identity.identity_id}", + ) + def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, From 6103511a459d13713b55713161f634df30a40ca4 Mon Sep 17 00:00:00 2001 From: joel Date: Sat, 13 Jan 2024 00:56:20 +0800 Subject: [PATCH 5/8] feat: link and unlink --- gotrue/_async/gotrue_client.py | 6 ++++-- gotrue/_sync/gotrue_client.py | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index d530f75a..c94283bd 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -274,7 +274,9 @@ async def sign_in_with_oauth( url = await self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) - async def link_identity(credentials): + async def link_identity(self, credentials): + provider = credentials.get("provider") + options = credentials.get("options", {}) redirect_to = options.get("redirect_to") scopes = options.get("scopes") params = options.get("query_params", {}) @@ -287,7 +289,7 @@ async def link_identity(credentials): url = await self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) - async def unlink_identity(identity): + async def unlink_identity(self, identity): return await self._request( "POST", f"/user/identities/{identity.identity_id}", diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index 30aa10b0..55b907f3 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -274,7 +274,9 @@ def sign_in_with_oauth( url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) - def link_identity(credentials): + def link_identity(self, credentials): + provider = credentials.get("provider") + options = credentials.get("options", {}) redirect_to = options.get("redirect_to") scopes = options.get("scopes") params = options.get("query_params", {}) @@ -287,7 +289,7 @@ def link_identity(credentials): url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) - def unlink_identity(identity): + def unlink_identity(self, identity): return self._request( "POST", f"/user/identities/{identity.identity_id}", From 2de717aa1785585ff872e4f94df891673b16858a Mon Sep 17 00:00:00 2001 From: joel Date: Mon, 15 Jan 2024 14:10:27 +0800 Subject: [PATCH 6/8] feat: add get_user_identities --- gotrue/_async/gotrue_client.py | 6 ++++++ gotrue/_sync/gotrue_client.py | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index c94283bd..47369052 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -289,6 +289,12 @@ async def link_identity(self, credentials): url = await self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + async def get_user_identities(self): + response = self.get_user() + user = response.get("user") + identities = user.get("identities", []) if user else [] + return {"data": {"identities": identities}} + async def unlink_identity(self, identity): return await self._request( "POST", diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index 55b907f3..e72ea0bc 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -289,6 +289,12 @@ def link_identity(self, credentials): url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + def get_user_identities(self): + response = self.get_user() + user = response.get("user") + identities = user.get("identities", []) if user else [] + return {"data": {"identities": identities}} + def unlink_identity(self, identity): return self._request( "POST", From 1308119b80b3685852a20ec322fd8bea4315fd75 Mon Sep 17 00:00:00 2001 From: joel Date: Sun, 28 Jan 2024 23:55:48 +0800 Subject: [PATCH 7/8] feat: add pydantic type --- gotrue/_async/gotrue_client.py | 11 +++++++---- gotrue/_sync/gotrue_client.py | 11 +++++++---- gotrue/types.py | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index 47369052..1005b260 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -48,6 +48,7 @@ AuthResponse, CodeExchangeParams, DecodedJWTDict, + IdentitiesResponse, MFAChallengeAndVerifyParams, MFAChallengeParams, MFAEnrollParams, @@ -291,14 +292,16 @@ async def link_identity(self, credentials): async def get_user_identities(self): response = self.get_user() - user = response.get("user") - identities = user.get("identities", []) if user else [] - return {"data": {"identities": identities}} + return ( + IdentitiesResponse(identities=response.user.identities) + if response.user + else AuthSessionMissingError() + ) async def unlink_identity(self, identity): return await self._request( "POST", - f"/user/identities/{identity.identity_id}", + f"/user/identities/{identity.id}", ) async def sign_in_with_otp( diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index e72ea0bc..7fc354f2 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -48,6 +48,7 @@ AuthResponse, CodeExchangeParams, DecodedJWTDict, + IdentitiesResponse, MFAChallengeAndVerifyParams, MFAChallengeParams, MFAEnrollParams, @@ -291,14 +292,16 @@ def link_identity(self, credentials): def get_user_identities(self): response = self.get_user() - user = response.get("user") - identities = user.get("identities", []) if user else [] - return {"data": {"identities": identities}} + return ( + IdentitiesResponse(identities=response.user.identities) + if response.user + else AuthSessionMissingError() + ) def unlink_identity(self, identity): return self._request( "POST", - f"/user/identities/{identity.identity_id}", + f"/user/identities/{identity.id}", ) def sign_in_with_otp( diff --git a/gotrue/types.py b/gotrue/types.py index b47c2084..609f1011 100644 --- a/gotrue/types.py +++ b/gotrue/types.py @@ -94,6 +94,14 @@ class OAuthResponse(BaseModel): url: str +class SSOResponse(BaseModel): + url: str + + +class IdentitiesResponse(BaseModel): + identities: List[UserIdentity] + + class UserResponse(BaseModel): user: User @@ -323,6 +331,17 @@ class SignInWithOAuthCredentials(TypedDict): options: NotRequired[SignInWithOAuthCredentialsOptions] +class SignInWithSSOCredentials(TypedDict): + provider_id: NotRequired[str] + domain: NotRequired[str] + options: NotRequired[SignInWithSSOOptions] + + +class SignInWithSSOOptions(TypedDict): + redirect_to: NotRequired[str] + skip_http_redirect: NotRequired[bool] + + class VerifyOtpParamsOptions(TypedDict): redirect_to: NotRequired[str] captcha_token: NotRequired[str] From 89bcd155c560ac404bc9f5e649027d3873661b0f Mon Sep 17 00:00:00 2001 From: joel Date: Mon, 29 Jan 2024 00:00:51 +0800 Subject: [PATCH 8/8] fix: run black --- gotrue/types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gotrue/types.py b/gotrue/types.py index aca0d22a..609f1011 100644 --- a/gotrue/types.py +++ b/gotrue/types.py @@ -97,9 +97,11 @@ class OAuthResponse(BaseModel): class SSOResponse(BaseModel): url: str + class IdentitiesResponse(BaseModel): identities: List[UserIdentity] + class UserResponse(BaseModel): user: User