我想要用于我的react原生android应用程序登录的android face_id身份验证sdk。我使用了一些插件,这些插件只支持android的手指验证和密码。请让我知道是否有任何插件或sdk可用,以便我可以在react原生android中使用。
如何通过创建本机模块在react native中使用此代码。https://developer.android.com/training/sign-in/biometric-auth
private Executor executor;
private BiometricPrompt biometricPrompt;
private BiometricPrompt.PromptInfo promptInfo;
executor = ContextCompat.getMainExecutor(this);
biometricPrompt = new BiometricPrompt(MainActivity.this,
executor, new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode,
@NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
Toast.makeText(getApplicationContext(),
"Authentication error: " + errString, Toast.LENGTH_SHORT)
.show();
}
@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
Toast.makeText(getApplicationContext(),
"Authentication succeeded!", Toast.LENGTH_SHORT).show();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Toast.makeText(getApplicationContext(), "Authentication failed",
Toast.LENGTH_SHORT)
.show();
}
});
promptInfo = new BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setNegativeButtonText("Use account password")
.build();
根据我最近的研究,expo-local-authentication
似乎可以用于人脸识别,但前提是android设备也有指纹认证硬件。
Expo-local-authentication
函数supportedAuthenticationTypesAsync()
始终只返回关于AuthenticationType.FINGERPRINT
的信息,即使android设备上也可以使用面部识别。尽管如此,即使带有指纹硬件的设备并没有指纹数据,只有人脸数据,它也能正常工作。然后expo-local-authentication
使用人脸解锁。
当安卓设备没有指纹硬件,但有人脸识别功能时,就会出现问题。则supportedAuthenticationTypesAsync()
仅返回undefined
,而authenticateAsync()
不工作。
以下是为测试而制作的零食:https://snack.expo.dev/-Y34x2K7-但你需要一个有这样硬件的设备。
我在这里准备了一个精确的问题,以便在这里找到人脸识别解锁但没有指纹解锁的安卓设备的解决方案:React Native 中Android设备上的人脸Id、生物测量、人脸识别解锁
通常在Android中使用指纹和iOS Face ID作为最新设备,我认为不可能在Android中以类似的方式管理Face ID。
例如,这个特定于Face ID和Touch ID的库只适用于iOS设备,而Biometrics适用于Android,其工作方式与Touch-ID类似。
其他用户也回答了类似的问题。
这里是许多api中的一个,您可以对本地指纹扫描仪进行反应,下面是一个示例:
const isBiometricValid = async () =>
FingerprintScanner.authenticate({
description: 'Scan your fingerprint on the device scanner to continue'
});
const availableBiometric = async () => FingerprintScanner.isSensorAvailable();
const secureLogin = async ({
cpf,
password,
setFieldError,
storedUser,
navigation,
dispatch,
setUseManualPassword,
useManualPassword,
setFieldValue
}) => {
const authArgs = {
cpf,
password,
setFieldError,
navigation,
dispatch
};
try {
const availableBiometricType = await availableBiometric();
if (!availableBiometricType) {
return AuthCreators.getToken({ ...authArgs });
}
if (useManualPassword) {
return AuthCreators.getToken({
...authArgs,
cpf: storedUser[0]
});
}
if (storedUser) {
const userAccessGranted = await isBiometricValid();
if (userAccessGranted) {
const storedPasswordEncrypted = await AsyncStorage.getItem('@__:password');
const decryptedPasswordBytes = CryptoJS.AES.decrypt(
storedPasswordEncrypted,
Config.USER_PASSWORD_ENCRYPTION_KEY
);
const decryptedPassword = decryptedPasswordBytes.toString(CryptoJS.enc.Utf8);
return AuthCreators.getToken({
...authArgs,
cpf: storedUser[0],
password: decryptedPassword
});
}
}
return AuthCreators.getToken({
...authArgs,
biometric: normalizedBiometricType(availableBiometricType)
});
} catch (error) {
return biometricAuthFailure({
...authArgs,
error,
setUseManualPassword,
setFieldValue,
storedUser
});
}
};
例如,您可以通过打开iOS 11等设备(或任何默认使用faceID的设备(进行测试和调试,并在Features>FaceID>已注册。