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
}