Я пытаюсь использовать Fido2 на Android. Мне удалось создать учетные данные с помощью следующего кода:
val options = PublicKeyCredentialCreationOptions .Builder() .setRp(PublicKeyCredentialRpEntity(params.rpId, params.rpName, null)) .setUser( PublicKeyCredentialUserEntity( Base64.decode(params.userId, Base64.URL_SAFE), параметры.имя_пользователя, params.userName, // TODO спросить Деклана об значке? параметры.имя_пользователя ) ) .setChallenge(Base64.decode(params.challenge, Base64.URL_SAFE)) .setParameters( Список( PublicKeyCredentialParameters( PublicKeyCredentialType.PUBLIC_KEY.toString(), params.pubKeyAlg ), ) ) .строить() val fido2ApiClient = context.reactContext?.let { Fido.getFido2ApiClient(it) } val Task = fido2ApiClient?.getRegisterPendingIntent(опции) задача?.addOnSuccessListener { пытаться { context.currentActivity!!.startIntentSenderForResult( это.intentSender, REGISTER_REQUEST_CODE, нулевой, 0, 0, 0 ) } catch (e: IntentSender.SendIntentException) { RNLog.w(context.reactContext as ReactContext ?, «ОШИБКА ROPO $e») } } задача?.addOnFailureListener { RNLog.w(context.reactContext as ReactContext?, «Не удалось запустить намерение $it») } И извлечение (подпись) осуществляется через:
val AllowKeys = ArrayList() for (i в 0 до params.allowCredentials.size) { val keyHandle: String = params.allowCredentials val keyHandleByte = Base64.decode(keyHandle, Base64.URL_SAFE) разрешенные ключи.add( PublicKeyCredentialDescriptor( PublicKeyCredentialType.PUBLIC_KEY.toString(), ключHandleByte, нулевой ) ) } val options = PublicKeyCredentialRequestOptions.Builder() .setChallenge(params.challenge.toByteArray()) .setRpId(params.rpId) .setAllowList(разрешенные ключи) .строить() val fido2ApiClient = context.reactContext?.let { Fido.getFido2ApiClient(it) } val задача = fido2ApiClient?.getSignPendingIntent(опции) задача?.addOnSuccessListener { пытаться { context.currentActivity!!.startIntentSenderForResult( это.intentSender, SIGN_REQUEST_CODE, нулевой, 0, 0, 0 ) } catch (e: IntentSender.SendIntentException) { RNLog.w(context.reactContext as ReactContext ?, «ОШИБКА ROPO $e») } } задача?.addOnFailureListener { RNLog.w(context.reactContext as ReactContext?, «Не удалось запустить намерение $it») } Это вызывает обе работы с прослушивателями активности. Вот фрагмент кода, который обрабатывает ответ на подпись/извлечение:
когда (resultCode) { Activity.RESULT_CANCELED -> { returnPromise!!.reject("authenticationCanceled", null, null) } Activity.RESULT_OK -> { if (!intent!!.hasExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA)) { returnPromise!!.reject("authenticationError", null, null) } еще { val credential = PublicKeyCredential.deserializeFromBytes(intent.getByteArrayExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA)!!) val ответ = credential.response если (ответ AuthenticatorErrorResponse) { returnPromise!!.reject("authenticationError", response.errorMessage, null) } еще { val userHandle = (ответ как AuthenticatorAssertionResponse).userHandle // ЭТО НУЛЬ!!! returnPromise!!.resolve(Base64.encodeToString(userHandle, Base64.URL_SAFE)) } } } } Однако проблема в том, что когда я пытаюсь получить доступ к AuthenticatorAssertionResponse.userHandle, значение там отсутствует, оно равно нулю.
Похоже, этот ответ предполагает, что на Android невозможно получить доступ к дескриптору пользователя.
Мне действительно интересно, не делаю ли я здесь что-то не так.
В качестве дополнительных данных в спецификации четко указано, что можно добавить расширение, указывающее на сохранение ключа на устройстве, которое затем должно сохранять/возвращать свойство дескриптора пользователя. Однако я не могу найти способ добавить это расширение в код Kotlin:
Я пытаюсь использовать Fido2 на Android. Мне удалось создать учетные данные с помощью следующего кода:
val options = PublicKeyCredentialCreationOptions .Builder() .setRp(PublicKeyCredentialRpEntity(params.rpId, params.rpName, null)) .setUser( PublicKeyCredentialUserEntity( Base64.decode(params.userId, Base64.URL_SAFE), параметры.имя_пользователя, params.userName, // TODO спросить Деклана об значке? параметры.имя_пользователя ) ) .setChallenge(Base64.decode(params.challenge, Base64.URL_SAFE)) .setParameters( Список( PublicKeyCredentialParameters( PublicKeyCredentialType.PUBLIC_KEY.toString(), params.pubKeyAlg ), ) ) .строить() val fido2ApiClient = context.reactContext?.let { Fido.getFido2ApiClient(it) } val Task = fido2ApiClient?.getRegisterPendingIntent(опции) задача?.addOnSuccessListener { пытаться { context.currentActivity!!.startIntentSenderForResult( это.intentSender, REGISTER_REQUEST_CODE, нулевой, 0, 0, 0 ) } catch (e: IntentSender.SendIntentException) { RNLog.w(context.reactContext as ReactContext ?, «ОШИБКА ROPO $e») } } задача?.addOnFailureListener { RNLog.w(context.reactContext as ReactContext?, «Не удалось запустить намерение $it») } И извлечение (подпись) осуществляется через:
val AllowKeys = ArrayList() for (i в 0 до params.allowCredentials.size) { val keyHandle: String = params.allowCredentials[i] val keyHandleByte = Base64.decode(keyHandle, Base64.URL_SAFE) разрешенные ключи.add( PublicKeyCredentialDescriptor( PublicKeyCredentialType.PUBLIC_KEY.toString(), ключHandleByte, нулевой ) ) } val options = PublicKeyCredentialRequestOptions.Builder() .setChallenge(params.challenge.toByteArray()) .setRpId(params.rpId) .setAllowList(разрешенные ключи) .строить() val fido2ApiClient = context.reactContext?.let { Fido.getFido2ApiClient(it) } val задача = fido2ApiClient?.getSignPendingIntent(опции) задача?.addOnSuccessListener { пытаться { context.currentActivity!!.startIntentSenderForResult( это.intentSender, SIGN_REQUEST_CODE, нулевой, 0, 0, 0 ) } catch (e: IntentSender.SendIntentException) { RNLog.w(context.reactContext as ReactContext ?, «ОШИБКА ROPO $e») } } задача?.addOnFailureListener { RNLog.w(context.reactContext as ReactContext?, «Не удалось запустить намерение $it») } Это вызывает обе работы с прослушивателями активности. Вот фрагмент кода, который обрабатывает ответ на подпись/извлечение:
когда (resultCode) { Activity.RESULT_CANCELED -> { returnPromise!!.reject("authenticationCanceled", null, null) } Activity.RESULT_OK -> { if (!intent!!.hasExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA)) { returnPromise!!.reject("authenticationError", null, null) } еще { val credential = PublicKeyCredential.deserializeFromBytes(intent.getByteArrayExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA)!!) val ответ = credential.response если (ответ AuthenticatorErrorResponse) { returnPromise!!.reject("authenticationError", response.errorMessage, null) } еще { val userHandle = (ответ как AuthenticatorAssertionResponse).userHandle // ЭТО НУЛЬ!!! returnPromise!!.resolve(Base64.encodeToString(userHandle, Base64.URL_SAFE)) } } } } Однако проблема в том, что когда я пытаюсь получить доступ к AuthenticatorAssertionResponse.userHandle, значение там отсутствует, оно равно нулю.
Похоже, этот ответ предполагает, что на Android невозможно получить доступ к дескриптору пользователя.
Мне действительно интересно, не делаю ли я здесь что-то не так.
В качестве дополнительных данных в спецификации четко указано, что можно добавить расширение, указывающее на сохранение ключа на устройстве, которое затем должно сохранять/возвращать свойство дескриптора пользователя. Однако я не могу найти способ добавить это расширение в код Kotlin:
Я реализую fido2 с Android. в Android мы должны поместить файл assetslinks.json в корень домена, например:
но потому что мы тестируем это в интрасети. есть ли какое-нибудь решение, например ios, с использованием mode=developer для тестирования в...
Я пишу приложение на основе FIDO2 C ++ с использованием webAuthn.dll для Yubikey 5 NFC (внешний аутентификатор) с использованием следующих API WebAuthn of Microsoft из
Я пытаюсь Apentative с ap Webauthanticatorgetassertion (). Я получаю ошибку...
Это мой первый раз, когда я пытаюсь написать сценарий самостоятельно, и я пытаюсь сделать что -то, что просматривает мои папки и возвращаю список, и я продолжаю получать этот тип Ernerr: Descriptor «Приложение» для «Список». Большое спасибо!...
Так что это определенно загадка для меня. Я строю приложение Flutter и использую новейшую версию Google_Sign_in (6.1.0 во время этого поста).
Я установил все это как то, что я думаю, подходит , и когда я пытаюсь войти в систему, я получаю...