Flutter fingerprint login
Tags: flutter
Published: 2021-06-07 03:23:39

No te rompas mucho la cabeza con esta funcionalidad.

Usa [Shared Preferences](https://pub.dev/packages/shared_preferences) para guardas las credenciales de tus usuarios. Puedes pasarte por su documentación para ver cómo funciona. Pero para tu comodidad, te ahorro el trabajo con esta pequeña clase.

```dart
import 'package:shared_preferences/shared_preferences.dart';

class SessionParams {
  static final String _userKey = '_userKey';
  static final String _passwordKey = '_passwordKey';
  final String user;
  final String password;

  SessionParams._(this.user, this.password);

  static Future<void> deleteSession() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.clear();
  }

  static Future<SessionParams> getSession() async {
    var prefs = await SharedPreferences.getInstance();
    var user = prefs.getString(_userKey) ?? '';
    var password = prefs.getString(_passwordKey) ?? '';
    return user, password);
  }

  /// ❗ Throwable Function
  Future<void> saveSession(String user, String password) async {
    var prefs = await SharedPreferences.getInstance();
    var isSaveUserParam =
        await prefs.setString(_userKey, user);
    var isSavePasswordParam = await prefs.setString(_passwordKey, password);

    if (isSaveUserParam && isSavePasswordParam) return;

    deleteSession();
    throw '<SessionParams> session not saved';
  }

  @override
  String toString() {
    return 'SessionParams {user: $user, password $password}';
  }
}
```

Para pedir la huella dactilar podemos hacer uso de [local_auth](https://pub.dev/packages/local_auth). Aquí también te echó una mano, buapo, con estás pequeñas funciones.

```dart
Future<bool> _canCheckBiometrics() async {
  return await _auth.canCheckBiometrics;
}

Future<bool> _faceIdAvailable() async {
  List<BiometricType> availableBiometrics =
      await _auth.getAvailableBiometrics();
  if (Platform.isIOS && availableBiometrics.contains(BiometricType.face))
    return true;
  return false;
}

Future<bool> _authenticateWithBiometrics() async {
  bool authenticated = false;

  try {
    authenticated = await _auth.authenticate(
        localizedReason: 'Scan your fingerprint to authenticate',
        useErrorDialogs: true,
        stickyAuth: true,
        biometricOnly: true);
  } on PlatformException catch (e) {
    print(e);
    return authenticated;
  } catch (e) {
    print('Oooopps Algo salio mal 🤷‍♂️');
  }
  
  return authenticated;
}
```

Ahora solo usamos todo lo anterior hecho 🚀🚀.

```dart
Future<void> loginWithBiometrics(){
  try {
    var session = await SessionParams.getSession();
    var authenticateWithBiometrics = await _authenticateWithBiometrics();

    if (authenticateWithBiometrics) {
      doLoginEvent(session.user, session.password, true);
    }
  } catch (e) {
    print('Oooopps Algo salio mal 🤷‍♂️');
  }
}

Future<bool> doLoginEvent(String user, String password, {bool remember = false}) async {
  // TODO: Este es el equivalente a tu función para hacer login.
  // Reemplázala 
  if (remember)
    await (await SessionParams.getSession())
              .saveSession(event.user, event.password);
  return true;
}
```
Mucha suerte en tus proyectos, precioso ❤️. Déjame tu opinión ¿Prefieres este tipo de ejemplos o preferirías una aplicación completa? ¿Otro tipo de tutoriales? Ayúdame a ayudarte.

PD: Si te preocupa la seguridad puedes pasar los parámetros por [crypt](https://pub.dev/packages/crypt). Se le deja este último paso al lector. Si eres muy flojo déjame un comentario y te echó un cable.