@@ -12,10 +12,15 @@ function getExcludeCredentials(authenticatorEnrollments = []) {
1212 const credentials = [ ] ;
1313 authenticatorEnrollments . forEach ( ( enrollement ) => {
1414 if ( enrollement . key === 'webauthn' ) {
15- credentials . push ( {
15+ const credential = {
1616 type : 'public-key' ,
1717 id : CryptoUtil . strToBin ( enrollement . credentialId ) ,
18- } ) ;
18+ } ;
19+ const transports = enrollement . transports ?? enrollement . profile ?. transports ;
20+ if ( Array . isArray ( transports ) ) {
21+ credential . transports = transports ;
22+ }
23+ credentials . push ( credential ) ;
1924 }
2025 } ) ;
2126 return credentials ;
@@ -86,19 +91,31 @@ const Body = BaseForm.extend({
8691 publicKey : options ,
8792 signal : this . webauthnAbortController && this . webauthnAbortController . signal
8893 } ) . then ( ( newCredential ) => {
94+ // example data: ["nfc", "usb"]
95+ const transports =
96+ webauthn . processWebAuthnResponse ( newCredential . response . getTransports , newCredential . response ) ;
8997 this . model . set ( {
9098 credentials : {
9199 clientData : CryptoUtil . binToStr ( newCredential . response . clientDataJSON ) ,
92100 attestation : CryptoUtil . binToStr ( newCredential . response . attestationObject ) ,
93- // example data: ["nfc", "usb"]
94- transports : webauthn . processWebAuthnResponse ( newCredential . response . getTransports , newCredential . response ) ,
101+ ...( transports !== null && { transports } ) ,
95102 // example data: {"credProps":{"rk":true}}
96103 clientExtensions : webauthn . processWebAuthnResponse ( newCredential . getClientExtensionResults , newCredential )
97104 }
98105 } ) ;
99106 this . saveForm ( this . model ) ;
100107 } )
101108 . catch ( ( error ) => {
109+ // Override the default browser RP ID mismatch error in order to provide
110+ // a more user friendly error and have it localized
111+ if ( webauthn . isRelyingPartyIdMismatchError ( error ) ) {
112+ this . model . trigger ( 'error' , this . model , {
113+ responseJSON : {
114+ errorSummary : loc ( 'signin.passkeys.error.SecurityError' , 'login' )
115+ }
116+ } ) ;
117+ return ;
118+ }
102119 this . model . trigger ( 'error' , this . model , { responseJSON : { errorSummary : getMessageFromBrowserError ( error ) } } ) ;
103120 } ) . finally ( ( ) => {
104121 this . webauthnAbortController = null ;
0 commit comments