Skip to content

Commit d9bd2b4

Browse files
authored
fix(clerk-js): Define priority for strategy passkey when user is missing that first factor (clerk#3013)
* fix(clerk-js): Define priority for strategy passkey when user is missing that first factor * chore(clerk-js): Add changeset
1 parent 19c9cfa commit d9bd2b4

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

.changeset/odd-rats-smash.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Fix: fallback to other first factors when preferred strategy is passkey but the user has not registered a passkey yet.

packages/clerk-js/src/ui/components/SignIn/utils.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { titleize } from '@clerk/shared';
22
import type { PreferredSignInStrategy, SignInFactor, SignInResource, SignInStrategy } from '@clerk/types';
33

4+
import { isWebAuthnSupported } from '../../../utils/passkeys';
45
import { PREFERRED_SIGN_IN_STRATEGIES } from '../../common/constants';
56
import { otpPrefFactorComparator, passwordPrefFactorComparator } from '../../utils/factorSorting';
67

@@ -55,6 +56,22 @@ const factorForIdentifier = (i: string | null) => (f: SignInFactor) => {
5556
return 'safeIdentifier' in f && f.safeIdentifier === i;
5657
};
5758

59+
function determineStrategyWhenPasskeyIsPreferred(
60+
factors: SignInFactor[],
61+
identifier: string | null,
62+
): SignInFactor | null {
63+
if (isWebAuthnSupported()) {
64+
// @ts-ignore
65+
const passkeyFactor = factors.find(({ strategy }) => strategy === 'passkey');
66+
67+
if (passkeyFactor) {
68+
return passkeyFactor;
69+
}
70+
}
71+
72+
return determineStrategyWhenOTPIsPreferred(factors, identifier);
73+
}
74+
5875
function determineStrategyWhenPasswordIsPreferred(
5976
factors: SignInFactor[],
6077
identifier: string | null,
@@ -90,10 +107,8 @@ export function determineStartingSignInFactor(
90107
return null;
91108
}
92109

93-
//TODO: Create proper function like `determineStrategyWhenOTPIsPreferred`
94110
if (preferredSignInStrategy === PREFERRED_SIGN_IN_STRATEGIES.Passkey) {
95-
// @ts-ignore
96-
return firstFactors.find(f => f.strategy === PREFERRED_SIGN_IN_STRATEGIES.Passkey);
111+
return determineStrategyWhenPasskeyIsPreferred(firstFactors, identifier);
97112
}
98113
return preferredSignInStrategy === PREFERRED_SIGN_IN_STRATEGIES.Password
99114
? determineStrategyWhenPasswordIsPreferred(firstFactors, identifier)

0 commit comments

Comments
 (0)