Section 8/161 menit
8. Cross-Device Authentication (Hybrid Transport)
8. Cross-Device Authentication (Hybrid Transport)
Hybrid transport memungkinkan pengguna menggunakan passkey di iPhone untuk autentikasi di Mac atau browser — menggunakan QR code dan Bluetooth proximity.
Cara Kerja Hybrid Transport
swift
Skenario: User login di MacBook, tapi passkey ada di iPhone
1. Mac (browser/app) generate QR code dengan FIDO2 hybrid initiation URL
2. User scan QR code dengan iPhone camera
3. iPhone dan Mac establish secure channel via Bluetooth dan server relay
4. iPhone prompt biometrik seperti biasa
5. Credential assertion dikirim ke Mac via secure channel
6. Mac mendapat assertion dan verifikasi ke server
Mengaktifkan Hybrid Transport di iOS App
swift
// iOS app (yang punya passkey) — tidak perlu konfigurasi khusus
// iCloud Keychain secara otomatis mendukung hybrid transport
// Passkey yang disimpan di iCloud Keychain bisa digunakan untuk cross-device auth
// Yang perlu dilakukan: pastikan passkey tersimpan dengan benar
// dan RP ID sesuai dengan yang digunakan di web/Mac app
// Untuk Mac app atau web yang ingin MENERIMA cross-device auth:
// (WebAuthn di browser sudah handle ini secara otomatis)
// Untuk native Mac app menggunakan ASAuthorizationController:
func createCrossDeviceAssertionRequest(challenge: Data) -> ASAuthorizationPlatformPublicKeyCredentialAssertionRequest {
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let request = provider.createCredentialAssertionRequest(challenge: challenge)
// Cross-device option otomatis tersedia di sheet UI
// User bisa pilih "Use a phone or tablet" di bottom sheet
return request
}
Security Key Support untuk Cross-Device Scenarios
swift
// Untuk enterprise yang menggunakan hardware security key
func createHybridEnabledRequest(challenge: Data) -> [ASAuthorizationRequest] {
let platformProvider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let platformRequest = platformProvider.createCredentialAssertionRequest(challenge: challenge)
let securityKeyProvider = ASAuthorizationSecurityKeyPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let securityKeyRequest = securityKeyProvider.createCredentialAssertionRequest(challenge: challenge)
// Kedua request dalam satu controller — user bisa pilih metode
return [platformRequest, securityKeyRequest]
}