Fido2 на Android, как вернуть дескриптор пользователя (идентификатор пользователя)Android

Форум для тех, кто программирует под Android
Ответить
Гость
 Fido2 на Android, как вернуть дескриптор пользователя (идентификатор пользователя)

Сообщение Гость »


Я пытаюсь использовать 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:


Изображение


Любая помощь приветствуется! Спасибо!
Ответить

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

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

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

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

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