From c2ea65dea7f45aa7202b70d9d6ee3f2a88efb9b5 Mon Sep 17 00:00:00 2001 From: Dawid Tarasiuk Date: Thu, 13 Jan 2022 14:08:07 +0100 Subject: [PATCH] Fix switch account login and credentials API wrong login loop issues (#1729) * Fix switch account login and credentials API wrong login loop issues * Update auth provider hook --- src/auth/hooks/useAuthProvider.ts | 19 ++++++++++++++++--- src/utils/credentialsManagement.ts | 4 ++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/auth/hooks/useAuthProvider.ts b/src/auth/hooks/useAuthProvider.ts index 9843d0d6a..cfeaff3d2 100644 --- a/src/auth/hooks/useAuthProvider.ts +++ b/src/auth/hooks/useAuthProvider.ts @@ -14,7 +14,7 @@ import { saveCredentials } from "@saleor/utils/credentialsManagement"; import ApolloClient from "apollo-client"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useQuery } from "react-apollo"; import { IntlShape } from "react-intl"; import urlJoin from "url-join"; @@ -50,6 +50,7 @@ export function useAuthProvider({ const navigate = useNavigator(); const { authenticated, authenticating, user } = useAuthState(); const [error, setError] = useState(); + const permitCredentialsAPI = useRef(true); useEffect(() => { if (authenticating && error) { @@ -58,14 +59,22 @@ export function useAuthProvider({ }, [authenticating]); useEffect(() => { - if (!authenticated && !authenticating) { + if (authenticated) { + permitCredentialsAPI.current = true; + } + }, [authenticated]); + + useEffect(() => { + if (!authenticated && !authenticating && permitCredentialsAPI.current) { + permitCredentialsAPI.current = false; loginWithCredentialsManagementAPI(handleLogin); } }, [authenticated, authenticating]); const userDetails = useQuery(userDetailsQuery, { client: apolloClient, - skip: !authenticated + skip: !authenticated, + fetchPolicy: "network-only" }); const handleLogout = async () => { @@ -82,6 +91,10 @@ export function useAuthProvider({ navigator.credentials.preventSilentAccess(); } + // Forget last logged in user data. + // On next login, user details query will be refetched due to cache-and-network fetch policy. + apolloClient.clearStore(); + const errors = result?.errors || []; const externalLogoutUrl = result diff --git a/src/utils/credentialsManagement.ts b/src/utils/credentialsManagement.ts index 6240bcc4f..d4b835b57 100644 --- a/src/utils/credentialsManagement.ts +++ b/src/utils/credentialsManagement.ts @@ -5,14 +5,14 @@ export const isSupported = !!( ); export async function login( - loginFn: (id: string, password: string) => T + loginFn: (id: string, password: string) => Promise ): Promise { let result: T; try { const credential = await navigator.credentials.get({ password: true }); if (credential instanceof PasswordCredential) { - result = loginFn(credential.id, credential.password); + result = await loginFn(credential.id, credential.password); } } catch { result = null;