Как интегрировать приложение PassKey в iOS с пользовательским бэкэнд Python с использованием webAuthnIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как интегрировать приложение PassKey в iOS с пользовательским бэкэнд Python с использованием webAuthn

Сообщение Anonymous »

intro

Is мой собственный бэкэнд, обслуживающий API для Android и iOS, написанный питон с использованием фреймы и библиотеки py_webauthn (https://github.com/duo-labs/py_weauthn. каждый, который позволяет пользователям регистрировать новые пассажиры и проверять пассажиры при входе. Для этого я посмотрел на пример приложения Apple Food Truck (см.: Https://developer.apple.com/documentati ... atform_app).образное. Android: < /p>

[*] Пользователь хочет зарегистрировать новый PassKey < /li>
Запрос устройства запрашивает задачу на сервере < /li>
Сервер получает запрос и использует адрес электронной почты пользователей в качестве имени и полноценного имени webAuthn generation_ opraties_ option_ option_ options < /options < /options < /options < /options < /opretaine_ /> Параметры, сгенерированные Webauth, отправляются обратно на устройство как json < /li>
Устройство создает запрос на общедоступный ключ, основанный на полученных параметрах, содержащих задачу < /li>
Пользователь видит устройство, требующее подтверждения, основанного на Biometrics (или что -либо еще), и завершает процесс пассивного устройства на устройстве. Регистрационный ответ json на сервер < /li>
Сервер проверяет полученный ответ регистрации с использованием функции webauth verify_registration_response. Он использует полученный ответ регистрационного ответа в качестве ввода, даже в качестве сгенерированной задачи с шага 3, как ожидается, и ожидаемое и ожидаемое_оригин, отформатированное как «Android: APK-Key-Hash: 8363ghjjhg_blabla_87234765 ^^%»
Сервер обратно на устройство, если версии были судов. /> проблема < /strong>

Когда я пытаюсь реализовать одни и те же шаги в приложении iOS, я застрял на шаге 7 и 8. Webauthn validate_registration_response всегда возвращается с ». Это начинается с того, что Android принимает полные параметры, которые производит функция generate_registration_options WeBauthn. Для iOS кажется, что я должен лишить вызов из этого ответа и передать его: < /p>

Код: Выделить всё

    @Environment(\.authorizationController) private var authorizationController

let authorizationResult = try await authorizationController.performRequests(
[passkeyRegistrationRequest(passkeyChallenge: passkeyChallenge, username: username, name: name)],
options: options)

private func passkeyRegistrationRequest(passkeyChallenge: Data, username: String, name: String) async -> ASAuthorizationRequest {
ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: Self.relyingPartyIdentifier)
.createCredentialRegistrationRequest(challenge: passkeyChallenge, name: name, userID: Data(username.utf8))
}
< /code>
Описанные шаги 5 и 6 обрабатываются в этом коде, но когда я окажусь на шаге 7 в коде: < /p>
private func handleAuthorizationResult(_ authorizationResult: ASAuthorizationResult, username: String? = nil) async throws -> String {
switch authorizationResult {
case let .password(passwordCredential):
// Unused
Logger.authorization.log("Password authorization succeeded: \(passwordCredential)")
case let .passkeyAssertion(passkeyAssertion):
// Unused
// The login was successful.
Logger.authorization.log("Passkey authorization succeeded: \(passkeyAssertion)")
case let .passkeyRegistration(passkeyRegistration):
// The registration was successful.
Logger.authorization.log("Passkey registration succeeded: \(passkeyRegistration")

guard let attestationObject = passkeyRegistration.rawAttestationObject else { return "" }
let clientDataJSON = passkeyRegistration.rawClientDataJSON
let credentialID = passkeyRegistration.credentialID

// Build the attestaion object
let payload = ["rawId": credentialID.base64URLEncode(), // .base64EncodedString(), // Base64
"id": passkeyRegistration.credentialID.base64URLEncode(),
"authenticatorAttachment": "platform", // Optional parameter
"clientExtensionResults": [String: Any](), // Optional parameter
"type": "public-key",
"response": [
"attestationObject": attestationObject.base64EncodedString(),
"clientDataJSON": clientDataJSON.base64EncodedString()
]
] as [String: Any]

var payloadJSONText = ""
if let payloadJSONData = try? JSONSerialization.data(withJSONObject: payload, options: .fragmentsAllowed) {
payloadJSONText = String(data: payloadJSONData, encoding: .utf8) ?? ""
}

Logger.authorization.log("Passkey registration succeeded 2: \(payloadJSONText)")
return payloadJSONText
default:
Logger.authorization.error("Received an unknown authorization result.")
// Throw an error and return to the caller.
throw AuthorizationHandlingError.unknownAuthorizationResult(authorizationResult)
}
return ""
}
В случае let .passkeyregistration (PasskeyRegistration): , я отправляю возвращенную полезную нагрузку обратно на сервер, где его следует проверить с помощью функции webAuthn verify_registration_response. Но я смог получить эту работу. Здесь. < /p>
то, что я попробовал до сих пор < /strong>

Я также думал, что могут быть проблемы, в которых Webauthn должен ожидать чего -то в формате Base64URL вместо Base64, попробовал несколько комбинаций форматов для поля, но не повезло. < /p>
Я не могу найти что -то в Интернете, что может помочь мне. Все, что я могу найти, использует либо библиотеки iOS, либо интернет -сервисы WebAuthn, и что это не то, что я хочу. Я пытаюсь сделать невозможное здесь?>

Подробнее здесь: https://stackoverflow.com/questions/789 ... g-webauthn
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»