Skip to content

Commit b249e26

Browse files
authored
feat(account): show specific error when passkey already registered (#8149)
Handle WebAuthn error codes in passkey binding flow to show more specific error messages instead of generic "Failed to create" message. - Show "passkey already registered" error when authenticator is already registered to the account - Silently handle user cancellation (ERROR_CEREMONY_ABORTED)
1 parent ac27988 commit b249e26

File tree

19 files changed

+53
-1
lines changed

19 files changed

+53
-1
lines changed

โ€Žpackages/account/src/pages/PasskeyBinding/index.tsxโ€Ž

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Button from '@experience/shared/components/Button';
22
import { AccountCenterControlValue, MfaFactor, type Mfa } from '@logto/schemas';
33
import { trySafe } from '@silverhand/essentials';
4-
import { browserSupportsWebAuthn, startRegistration } from '@simplewebauthn/browser';
4+
import { browserSupportsWebAuthn, startRegistration, WebAuthnError } from '@simplewebauthn/browser';
55
import { useCallback, useContext, useEffect, useState } from 'react';
66
import { useTranslation } from 'react-i18next';
77
import { useNavigate } from 'react-router-dom';
@@ -84,6 +84,23 @@ const PasskeyBinding = () => {
8484
async () => startRegistration(registrationOptions),
8585
(error) => {
8686
console.error('WebAuthn registration failed:', error);
87+
88+
if (error instanceof WebAuthnError) {
89+
switch (error.code) {
90+
case 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED': {
91+
setToast(t('account_center.mfa.passkey_already_registered'));
92+
return;
93+
}
94+
case 'ERROR_CEREMONY_ABORTED': {
95+
// User cancelled the operation, no need to show error
96+
return;
97+
}
98+
default: {
99+
break;
100+
}
101+
}
102+
}
103+
87104
setToast(t('mfa.webauthn_failed_to_create'));
88105
}
89106
);

โ€Žpackages/phrases-experience/src/locales/ar/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ const account_center = {
100100
backup_code_not_enabled: 'ุฑู…ุฒ ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠ ุบูŠุฑ ู…ู…ูƒู‘ู†. ูŠุฑุฌู‰ ุงู„ุงุชุตุงู„ ุจุงู„ู…ุณุคูˆู„ ู„ุชู…ูƒูŠู†ู‡.',
101101
backup_code_requires_other_mfa: 'ุชุชุทู„ุจ ุฑู…ูˆุฒ ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠ ุฅุนุฏุงุฏ ุทุฑูŠู‚ุฉ MFA ุฃุฎุฑู‰ ุฃูˆู„ุงู‹.',
102102
passkey_not_enabled: 'ู…ูุชุงุญ ุงู„ู…ุฑูˆุฑ ุบูŠุฑ ู…ูุนู‘ู„. ูŠุฑุฌู‰ ุงู„ุชูˆุงุตู„ ู…ุน ุงู„ู…ุณุคูˆู„ ู„ุชูุนูŠู„ู‡.',
103+
passkey_already_registered:
104+
'This passkey is already registered to your account. Please use a different authenticator.',
103105
},
104106
update_success: {
105107
default: {

โ€Žpackages/phrases-experience/src/locales/de/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ const account_center = {
117117
'Fรผr Backup-Codes muss zuerst eine andere MFA-Methode eingerichtet werden.',
118118
passkey_not_enabled:
119119
'Passkey ist nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um es zu aktivieren.',
120+
passkey_already_registered:
121+
'This passkey is already registered to your account. Please use a different authenticator.',
120122
},
121123
update_success: {
122124
default: {

โ€Žpackages/phrases-experience/src/locales/en/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ const account_center = {
108108
'Backup code is not enabled. Please contact your administrator to enable it.',
109109
backup_code_requires_other_mfa: 'Backup codes require another MFA method to be set up first.',
110110
passkey_not_enabled: 'Passkey is not enabled. Please contact your administrator to enable it.',
111+
passkey_already_registered:
112+
'This passkey is already registered to your account. Please use a different authenticator.',
111113
},
112114
update_success: {
113115
default: {

โ€Žpackages/phrases-experience/src/locales/es/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ const account_center = {
113113
'Los cรณdigos de respaldo requieren que se configure otro mรฉtodo MFA primero.',
114114
passkey_not_enabled:
115115
'Passkey no estรก habilitado. Por favor, contacta a tu administrador para habilitarlo.',
116+
passkey_already_registered:
117+
'This passkey is already registered to your account. Please use a different authenticator.',
116118
},
117119
update_success: {
118120
default: {

โ€Žpackages/phrases-experience/src/locales/fr/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ const account_center = {
114114
"Les codes de secours nรฉcessitent qu'une autre mรฉthode MFA soit d'abord configurรฉe.",
115115
passkey_not_enabled:
116116
"Passkey n'est pas activรฉ. Veuillez contacter votre administrateur pour l'activer.",
117+
passkey_already_registered:
118+
'This passkey is already registered to your account. Please use a different authenticator.',
117119
},
118120
update_success: {
119121
default: {

โ€Žpackages/phrases-experience/src/locales/it/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ const account_center = {
112112
backup_code_requires_other_mfa:
113113
'I codici di backup richiedono che venga prima configurato un altro metodo MFA.',
114114
passkey_not_enabled: "Passkey non รจ abilitato. Contatta l'amministratore per abilitarlo.",
115+
passkey_already_registered:
116+
'This passkey is already registered to your account. Please use a different authenticator.',
115117
},
116118
update_success: {
117119
default: {

โ€Žpackages/phrases-experience/src/locales/ja/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ const account_center = {
105105
backup_code_requires_other_mfa:
106106
'ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚ณใƒผใƒ‰ใ‚’ไฝฟ็”จใ™ใ‚‹ใซใฏใ€ใพใšไป–ใฎ MFA ใƒกใ‚ฝใƒƒใƒ‰ใ‚’่จญๅฎšใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚',
107107
passkey_not_enabled: 'ใƒ‘ใ‚นใ‚ญใƒผใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใพใ›ใ‚“ใ€‚็ฎก็†่€…ใซ้€ฃ็ตกใ—ใฆๆœ‰ๅŠนใซใ—ใฆใใ ใ•ใ„ใ€‚',
108+
passkey_already_registered:
109+
'This passkey is already registered to your account. Please use a different authenticator.',
108110
},
109111
update_success: {
110112
default: {

โ€Žpackages/phrases-experience/src/locales/ko/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ const account_center = {
102102
'๋ฐฑ์—… ์ฝ”๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค.',
103103
backup_code_requires_other_mfa: '๋ฐฑ์—… ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ MFA ๋ฐฉ๋ฒ•์„ ๋จผ์ € ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.',
104104
passkey_not_enabled: 'ํŒจ์Šคํ‚ค๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.',
105+
passkey_already_registered:
106+
'This passkey is already registered to your account. Please use a different authenticator.',
105107
},
106108
update_success: {
107109
default: {

โ€Žpackages/phrases-experience/src/locales/pl-pl/account-center.tsโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ const account_center = {
108108
'Kody zapasowe wymagajฤ… wczeล›niejszego skonfigurowania innej metody MFA.',
109109
passkey_not_enabled:
110110
'Passkey nie jest wล‚ฤ…czony. Skontaktuj siฤ™ z administratorem, aby go wล‚ฤ…czyฤ‡.',
111+
passkey_already_registered:
112+
'This passkey is already registered to your account. Please use a different authenticator.',
111113
},
112114
update_success: {
113115
default: {

0 commit comments

Comments
ย (0)