Section 6/161 menit
6. Credential Types dan Parameter Lanjutan
6. Credential Types dan Parameter Lanjutan
Platform vs Security Key Credentials
swift
// Platform credential: Secure Enclave / iCloud Keychain (default untuk kebanyakan app)
let platformProvider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
// Security key: hardware token (YubiKey, dsb) — untuk enterprise/high-security
let securityKeyProvider = ASAuthorizationSecurityKeyPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
// Security key registration — support algoritma spesifik
let securityKeyRequest = securityKeyProvider.createCredentialRegistrationRequest(
challenge: challenge,
displayName: "Security Key",
name: username,
userID: userID
)
// Tentukan algoritma yang didukung
securityKeyRequest.credentialParameters = [
ASAuthorizationPublicKeyCredentialParameters(
algorithm: .ES256 // ECDSA P-256
),
ASAuthorizationPublicKeyCredentialParameters(
algorithm: .RS256 // RSA 256 (untuk security key lama)
)
]
securityKeyRequest.residentKeyPreference = .required // Resident key = passkey di device
securityKeyRequest.userVerificationPreference = .preferred
User Verification Preference
swift
// .required — WAJIB biometrik/PIN, gagal jika tidak tersedia
request.userVerificationPreference = .required
// Gunakan untuk: aplikasi keuangan, health, enterprise
// .preferred — Minta biometrik, tapi lanjut jika tidak ada (default)
request.userVerificationPreference = .preferred
// Gunakan untuk: kebanyakan aplikasi
// .discouraged — Tidak minta biometrik, hanya user presence (touch)
request.userVerificationPreference = .discouraged
// Gunakan untuk: low-security, frictionless UX
Allowed Credentials (Pre-fill)
swift
// Jika sudah tahu user mana yang login (username-first flow),
// sediakan credential ID agar UI lebih cepat
func assertWithKnownUser(userId: String, challenge: Data) async throws {
// Ambil credential IDs yang terdaftar untuk user ini dari server
let knownCredentials = try await server.getCredentialIds(for: userId)
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let request = provider.createCredentialAssertionRequest(challenge: challenge)
request.allowedCredentials = knownCredentials.map {
ASAuthorizationPlatformPublicKeyCredentialDescriptor(credentialID: $0)
}
// iOS akan langsung prompt untuk credential yang diizinkan saja
// Tidak perlu user memilih dari daftar semua passkey mereka
}