[app-attest-env] Log the actual error behind guest-session App Attest failures

Guest session handshake fails silently after the challenge step - no
console output, just a generic "could not load" message in the UI.
DCAppAttestService errors (generateKey/attestKey/generateAssertion)
propagate up uncaught by anything that logs them. Add explicit logging
at each step so the real thrown error is visible instead of debugging
blind.
This commit is contained in:
Daniel Arantes Loverde
2026-07-31 14:05:29 -03:00
parent 0cf3ab7b4f
commit e9e3e9da1f
2 changed files with 24 additions and 3 deletions

View File

@@ -93,6 +93,7 @@ actor GuestSessionService {
#if os(iOS) #if os(iOS)
private func refreshTokenWithAppAttest() async throws -> String { private func refreshTokenWithAppAttest() async throws -> String {
print("[GuestSessionService] DCAppAttestService.isSupported = \(DCAppAttestService.shared.isSupported), existingKeyId = \(store.appAttestKeyId ?? "nil")")
guard DCAppAttestService.shared.isSupported else { guard DCAppAttestService.shared.isSupported else {
// Simulator can never support App Attest (hardware limitation, // Simulator can never support App Attest (hardware limitation,
// not environment-specific) server has its own documented // not environment-specific) server has its own documented
@@ -141,9 +142,22 @@ actor GuestSessionService {
} }
private func handshakeWithFreshAttestation(challenge: String) async throws -> String { private func handshakeWithFreshAttestation(challenge: String) async throws -> String {
let keyId = try await DCAppAttestService.shared.generateKey() let keyId: String
do {
keyId = try await DCAppAttestService.shared.generateKey()
} catch {
print("[GuestSessionService] generateKey failed: \(error)")
throw error
}
let clientDataHash = Data(SHA256.hash(data: Data(challenge.utf8))) let clientDataHash = Data(SHA256.hash(data: Data(challenge.utf8)))
let attestationObject = try await DCAppAttestService.shared.attestKey(keyId, clientDataHash: clientDataHash) let attestationObject: Data
do {
attestationObject = try await DCAppAttestService.shared.attestKey(keyId, clientDataHash: clientDataHash)
} catch {
print("[GuestSessionService] attestKey failed: \(error)")
throw error
}
let payload = GuestSessionAttestPayload( let payload = GuestSessionAttestPayload(
platform: "ios", platform: "ios",
@@ -175,7 +189,13 @@ actor GuestSessionService {
private func handshakeWithAssertion(keyId: String, challenge: String) async throws -> String { private func handshakeWithAssertion(keyId: String, challenge: String) async throws -> String {
let clientDataHash = Data(SHA256.hash(data: Data(challenge.utf8))) let clientDataHash = Data(SHA256.hash(data: Data(challenge.utf8)))
let assertionObject = try await DCAppAttestService.shared.generateAssertion(keyId, clientDataHash: clientDataHash) let assertionObject: Data
do {
assertionObject = try await DCAppAttestService.shared.generateAssertion(keyId, clientDataHash: clientDataHash)
} catch {
print("[GuestSessionService] generateAssertion failed: \(error)")
throw error
}
let payload = GuestSessionAttestPayload( let payload = GuestSessionAttestPayload(
platform: "ios", platform: "ios",

View File

@@ -161,6 +161,7 @@ struct PublicLocationPickerView: View {
errorMessage = "Nenhum estado disponível no momento." errorMessage = "Nenhum estado disponível no momento."
} }
} catch { } catch {
print("[PublicLocationPickerView] loadLocations failed: \(error)")
errorMessage = "Não foi possível carregar. Tente novamente." errorMessage = "Não foi possível carregar. Tente novamente."
} }
isLoading = false isLoading = false