After user authenticates i process the credential assertion like this:
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
switch authorization.credential {
case let credentialRegistration as ASAuthorizationPlatformPublicKeyCredentialRegistration:
let id = Base64URLUtils.encode(credentialRegistration.credentialID)
let rawId = Base64URLUtils.encode(credentialRegistration.credentialID)
let type = "public-key"
let authenticatorAttachment = getAuthenticatorAttachment(attachment: credentialRegistration.attachment)
let attestationObject = credentialRegistration.rawAttestationObject != nil ? Base64URLUtils.encode(credentialRegistration.rawAttestationObject!) : ""
let clientDataJSON = Base64URLUtils.encode(credentialRegistration.rawClientDataJSON)
var clientExtensionResults: [String: Any] = [:]
if let prf = credentialRegistration.prf,
let symmetricKey = prf.first {
let prfData = symmetricKey.withUnsafeBytes { Data($0) }
let prfResult = Base64URLUtils.encode(prfData)
clientExtensionResults["prf"] = ["results": ["first": prfResult]]
}
call.resolve([
"rawId": rawId,
"authenticatorAttachment": authenticatorAttachment,
"type": type,
"id": id,
"response": [
"attestationObject": attestationObject,
"clientDataJSON": clientDataJSON
],
"clientExtensionResults": clientExtensionResults
])
case let credentialAssertion as ASAuthorizationPlatformPublicKeyCredentialAssertion:
NSLog("[CredentialAssertion] Starting to process credential assertion")
NSLog("[CredentialAssertion] Credential ID: %@", Base64URLUtils.encode(credentialAssertion.credentialID))
NSLog("[CredentialAssertion] Raw Client Data JSON: %@", Base64URLUtils.encode(credentialAssertion.rawClientDataJSON))
NSLog("[CredentialAssertion] Raw Authenticator Data: %@", Base64URLUtils.encode(credentialAssertion.rawAuthenticatorData))
NSLog("[CredentialAssertion] Signature: %@", Base64URLUtils.encode(credentialAssertion.signature))
NSLog("[CredentialAssertion] User ID: %@", Base64URLUtils.encode(credentialAssertion.userID))
let id = Base64URLUtils.encode(credentialAssertion.credentialID)
let rawId = Base64URLUtils.encode(credentialAssertion.credentialID)
let type = "public-key"
let authenticatorAttachment = getAuthenticatorAttachment(attachment: credentialAssertion.attachment)
let clientDataJSON = Base64URLUtils.encode(credentialAssertion.rawClientDataJSON)
// Initialize empty PRF result string that will store the Base64URL encoded PRF data
var prfResult = ""
// Check if PRF (Pseudorandom Function) data is available from the credential
var clientExtensionResults: [String: Any] = [:]
if let prfCredentialData = credentialAssertion.prf,
let prfSymmetricKey = prfCredentialData.first as? SymmetricKey {
let prfRawBytes = prfSymmetricKey.withUnsafeBytes { Data($0) }
let prfResult = Base64URLUtils.encode(prfRawBytes)
clientExtensionResults["prf"] = ["results": ["first": prfResult]]
NSLog("[CredentialAssertion] PRF Result: %@", prfResult)
} else {
NSLog("[CredentialAssertion] No PRF data available")
}
let authenticatorData = Base64URLUtils.encode(credentialAssertion.rawAuthenticatorData)
let signature = Base64URLUtils.encode(credentialAssertion.signature)
let userHandle = Base64URLUtils.encode(credentialAssertion.userID)
call.resolve([
"rawId": rawId,
"authenticatorAttachment": authenticatorAttachment,
"type": type,
"id": id,
"response": [
"clientDataJSON": clientDataJSON,
"authenticatorData": authenticatorData,
"signature": signature,
"userHandle": userHandle
],
"clientExtensionResults": clientExtensionResults
])
default:
call.reject(PasskeyError.UNKNOWN.rawValue)
}
}
Logs:
Feb 5 11:38:13 App(AuthenticationServices)[32793] <Notice>: Successfully completed authorization: <ASAuthorizationPlatformPublicKeyCredentialAssertion: 0x3002f80e0>
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] Starting to process credential assertion
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] Credential ID: NxlQaXK64UAY0EsehesfFy9rt-0
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] Raw Client Data JSON: eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoicmFuZG9tQ2hhbGxlbmdlMTJ3Iiwib3JpZ2luIjoiaHR0cHM6Ly91bWJyZWxsYXNvZnR3YXJlLnJvIn0
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] Raw Authenticator Data: vldv6g0NnZfh2nEqmP9eXTqSD1qTiN4v-J9WG1xlVsYdAAAAAA
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] Signature: MEQCH0XTR7IyewTV8J3Iv3pZII4ohTKdKRtreRhagUZjG8cCIQDhFCuPJJumOjLJaWbvw0ppuxh1EIjL_QMFIKuh-73M6Q
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] User ID: dXNlcjEyMw
Feb 5 11:38:13 App(Foundation)[32793] <Notice>: [CredentialAssertion] PRF Result: **nmKfLMSLd0vuV8xgAMQQ40rajzkSdHM_f3V4mq5UUqo**