oblador / react-native-keychain

:key: Keychain Access for React Native
MIT License
3.21k stars 520 forks source link

Inconsistent Error Messages Between iOS and Android for Cancelled Biometry Operations #609

Open AntoineThibi opened 1 year ago

AntoineThibi commented 1 year ago

Hello, I've come across an inconsistency in the error messages provided by react-native-keychain version 8.1.2 when a user cancels a biometry operation.

Steps to reproduce:

  1. Prompt the user for biometric authentication using react-native-keychain.
  2. On the biometric prompt, click "Cancel" or the equivalent option.

Expected Result:

A consistent error message for both iOS and Android.

Actual Result:

iOS: The error message is "User canceled the operation." Android: The error message is "code: 13, msg: Cancel".

Possible Solutions:

It would be beneficial for the development community if there was consistency in the error messages across platforms. One of the following solutions could be considered:

Standardize the error message across both platforms. Export the instance of the error in order to manipulate them more easily.

Additional Information:

React Native Version: 0.72.3 Device(s) Tested On: iPhone 13 / OnePlus6T OS Version: iOS 16.1.1 / Android 11.1.2.2

Catdaemon commented 1 year ago

Yes this would be nice. There's also another case you need to handle where the user hit the back button on Android (there's no cancel button on the Samsung Knox implementation!). There might be more, but these are the ones we found on our array of test devices.

catch (e) {
    const stringifiedError = JSON.stringify(e)
    if (
      (e && typeof e === 'object' && 'code' in e && String(e.code) === '-128') || // iOS cancel
      stringifiedError.includes('code: 13') || // android "log out" pressed
      stringifiedError.includes('code: 10') // android cancel via back button
    ) {
      // Handle cancel
    }
olie-chan commented 8 months ago

For context I believe the error codes match up with this https://developer.android.com/reference/androidx/biometric/BiometricPrompt#constants_1

https://github.com/oblador/react-native-keychain/blob/5fc9e8b21d7ef4ae9130c091e1e1d793085827aa/android/src/test/java/com/oblador/keychain/decryptionHandler/DecryptionResultHandlerInteractiveBiometricTest.java#L27