What happens
With authenticatorAttachment: 'cross-platform' and userVerification: 'required', create() does
not complete on iOS 26.5.2 with a YubiKey 5 FIPS over USB-C:
- iOS shows the "Set Up Security Key" sheet.
- The user inserts the key and touches it.
- iOS never asks for the key PIN.
- The promise does not resolve, and no credential is stored.
The same key registers correctly through a desktop browser against the same relying party. So the
key and the relying-party configuration are good.
Key diagnostic: a lone security-key request fails, a combined request works
On the same device and key:
create() with only the security-key registration request submitted to ASAuthorizationController
(that is, authenticatorAttachment: 'cross-platform') fails as above (no PIN, no credential).
create() with both the platform and security-key registration requests submitted together
(attachment unset) works. iOS shows a combined sheet. The user picks the security key, enters the
PIN, touches the key, and the credential is stored. Verified on a device with a YubiKey 5 FIPS over
USB-C.
So the failure is specific to iOS 26 presenting a single security-key registration request. Including
the platform request alongside it drives the ceremony correctly. This may be an
ASAuthorizationController behaviour on iOS 26: a lone
ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest does not reach the PIN sub-flow.
That could be an OS bug worth reporting to Apple. The library could also work around it by always
including a platform request.
Notes
- No PIN prompt suggests the user-verification sub-flow is not driven for the lone request.
residentKey: 'preferred' and residentKey: 'discouraged' behave the same.
- Authentication (
get()) with a security key works on the same device. So the security-key provider
itself is functional.
Environment
react-native-passkeys 0.4.1
- Expo SDK 57, iOS 26.5.2
- YubiKey 5 FIPS (USB-C; NFC shows the same result)
userVerification: 'required', attestation: 'direct'
Related: #67 (the change that presents both providers, which avoids this by always including a platform request).
What happens
With
authenticatorAttachment: 'cross-platform'anduserVerification: 'required',create()doesnot complete on iOS 26.5.2 with a YubiKey 5 FIPS over USB-C:
The same key registers correctly through a desktop browser against the same relying party. So the
key and the relying-party configuration are good.
Key diagnostic: a lone security-key request fails, a combined request works
On the same device and key:
create()with only the security-key registration request submitted toASAuthorizationController(that is,
authenticatorAttachment: 'cross-platform') fails as above (no PIN, no credential).create()with both the platform and security-key registration requests submitted together(attachment unset) works. iOS shows a combined sheet. The user picks the security key, enters the
PIN, touches the key, and the credential is stored. Verified on a device with a YubiKey 5 FIPS over
USB-C.
So the failure is specific to iOS 26 presenting a single security-key registration request. Including
the platform request alongside it drives the ceremony correctly. This may be an
ASAuthorizationControllerbehaviour on iOS 26: a loneASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequestdoes not reach the PIN sub-flow.That could be an OS bug worth reporting to Apple. The library could also work around it by always
including a platform request.
Notes
residentKey: 'preferred'andresidentKey: 'discouraged'behave the same.get()) with a security key works on the same device. So the security-key provideritself is functional.
Environment
react-native-passkeys0.4.1userVerification: 'required',attestation: 'direct'Related: #67 (the change that presents both providers, which avoids this by always including a platform request).