From 24325c472385fc260880ba076589dc9b9db1eed5 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:04:39 -0300 Subject: [PATCH] Refactor implementation --- packages/expo/src/hooks/useSso.ts | 57 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/packages/expo/src/hooks/useSso.ts b/packages/expo/src/hooks/useSso.ts index 2a1d2560e21..84035462af6 100644 --- a/packages/expo/src/hooks/useSso.ts +++ b/packages/expo/src/hooks/useSso.ts @@ -18,7 +18,11 @@ export type StartSSOParams = { }; export type StartSSOFlowReturnType = { - createdSessionId: string; + /** + * Session ID created upon sign-in completion, or null if incomplete. + * If incomplete, use signIn or signUp for next steps like MFA. + */ + createdSessionId: string | null; setActive?: SetActive; signIn?: SignInResource; signUp?: SignUpResource; @@ -26,24 +30,21 @@ export type StartSSOFlowReturnType = { }; export function useSSO(useSSOParams: UseSSOParams) { - const { strategy } = useSSOParams || {}; - if (!strategy) { - return errorThrower.throw('Missing strategy'); - } - const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); async function startFlow(startSSOFlowParams?: StartSSOParams): Promise { if (!isSignInLoaded || !isSignUpLoaded) { return { - createdSessionId: '', + createdSessionId: null, signIn, signUp, setActive, }; } + let createdSessionId = signIn.createdSessionId; + // Create a redirect url for the current platform and environment. // // This redirect URL needs to be whitelisted for your Clerk production instance via @@ -58,51 +59,49 @@ export function useSSO(useSSOParams: UseSSOParams) { path: 'sso-native-callback', }); - await signIn.create({ strategy, redirectUrl: oauthRedirectUrl, identifier: startSSOFlowParams?.identifier }); + await signIn.create({ + strategy: useSSOParams.strategy, + redirectUrl: oauthRedirectUrl, + identifier: startSSOFlowParams?.identifier, + }); const { externalVerificationRedirectURL } = signIn.firstFactorVerification; - if (!externalVerificationRedirectURL) { - return errorThrower.throw('Missing external verification redirect URL for SSO flow'); + return errorThrower.throw( + 'Missing external verification redirect URL for SSO flow. This indicates an API issue - please contact support for assistance.', + ); } + // TODO - Add unit tests to handle different results const authSessionResult = await WebBrowser.openAuthSessionAsync( externalVerificationRedirectURL.toString(), oauthRedirectUrl, ); - - // @ts-expect-error - const { type, url } = authSessionResult || {}; - - // TODO: Check all the possible AuthSession results - // https://docs.expo.dev/versions/latest/sdk/auth-session/#returns-7 - if (type !== 'success') { + if (authSessionResult.type !== 'success' || !authSessionResult.url) { return { authSessionResult, - createdSessionId: '', + createdSessionId, setActive, signIn, signUp, }; } - const params = new URL(url).searchParams; + const params = new URL(authSessionResult.url).searchParams; + const rotatingTokenNonce = params.get('rotating_token_nonce'); + if (!rotatingTokenNonce) { + return errorThrower.throw( + 'Missing rotating_token_nonce in SSO callback. This indicates an API issue - please contact support for assistance.', + ); + } - const rotatingTokenNonce = params.get('rotating_token_nonce') || ''; await signIn.reload({ rotatingTokenNonce }); - - const { status, firstFactorVerification } = signIn; - - let createdSessionId = ''; - - if (status === 'complete') { - createdSessionId = signIn.createdSessionId!; - } else if (firstFactorVerification.status === 'transferable') { + if (signIn.firstFactorVerification.status === 'transferable') { await signUp.create({ transfer: true, unsafeMetadata: startSSOFlowParams?.unsafeMetadata || useSSOParams.unsafeMetadata, }); - createdSessionId = signUp.createdSessionId || ''; + createdSessionId = signUp.createdSessionId; } return {