diff --git a/gotrue/_async/gotrue_client.py b/gotrue/_async/gotrue_client.py index 2b5f251f..a29785bc 100644 --- a/gotrue/_async/gotrue_client.py +++ b/gotrue/_async/gotrue_client.py @@ -49,6 +49,7 @@ AuthResponse, CodeExchangeParams, DecodedJWTDict, + IdentitiesResponse, MFAChallengeAndVerifyParams, MFAChallengeParams, MFAEnrollParams, @@ -332,6 +333,35 @@ 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(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", {}) + 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 get_user_identities(self): + response = self.get_user() + 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.id}", + ) + async def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, diff --git a/gotrue/_sync/gotrue_client.py b/gotrue/_sync/gotrue_client.py index 8e695010..c495f857 100644 --- a/gotrue/_sync/gotrue_client.py +++ b/gotrue/_sync/gotrue_client.py @@ -49,6 +49,7 @@ AuthResponse, CodeExchangeParams, DecodedJWTDict, + IdentitiesResponse, MFAChallengeAndVerifyParams, MFAChallengeParams, MFAEnrollParams, @@ -332,6 +333,35 @@ def sign_in_with_oauth( url = self._get_url_for_provider(provider, params) return OAuthResponse(provider=provider, url=url) + 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", {}) + 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 get_user_identities(self): + response = self.get_user() + return ( + IdentitiesResponse(identities=response.user.identities) + if response.user + else AuthSessionMissingError() + ) + + def unlink_identity(self, identity): + return self._request( + "POST", + f"/user/identities/{identity.id}", + ) + def sign_in_with_otp( self, credentials: SignInWithPasswordlessCredentials, diff --git a/gotrue/types.py b/gotrue/types.py index 04e804d1..609f1011 100644 --- a/gotrue/types.py +++ b/gotrue/types.py @@ -98,6 +98,10 @@ class SSOResponse(BaseModel): url: str +class IdentitiesResponse(BaseModel): + identities: List[UserIdentity] + + class UserResponse(BaseModel): user: User