import AuthenticationServices
// Get WebAuthn options from Hanko
func getWebAuthnOptions() async -> PublicKeyCredentialCreationOptions? {
guard let url = URL(string: "\(hankoApiUrl)/webauthn/registration/initialize") else { return nil }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(jwtToken)", forHTTPHeaderField: "Authorization")
do {
let (data, _) = try await URLSession.shared.data(for: request)
return try JSONDecoder().decode(PublicKeyCredentialCreationOptions.self, from: data)
} catch {
print("Error getting WebAuthn options: \(error)")
return nil
}
}
// Create passkey using native API
func createPasskey(options: PublicKeyCredentialCreationOptions) async -> Bool {
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: options.rp.id)
let request = provider.createCredentialRegistrationRequest(
challenge: Data(base64URLEncoded: options.challenge)!,
name: options.user.name,
userID: Data(base64URLEncoded: options.user.id)!
)
let controller = ASAuthorizationController(authorizationRequests: [request])
// Handle delegate methods and finalize with Hanko API
return true
}