# Local Auth

Este [plugin](https://pub.dev/packages/local_auth) é muito interessante, e traz essa possível implementação, uma maneira a mais de trazer segurança no uso dos nossos aplicativos.

Primeiramente, vou mostrar uma classe para o uso de algumas funções do plugin, para checar se o usuário possui alguma autenticação por biometrias cadastrada, e fazendo de fato essa autenticação para liberar acesso.

```dart
class LocalAuthApi {
  bool biometricOnly = true;
  static final _auth = LocalAuthentication();

  static Future<bool> hasBiometrics() async {
    try {
      return await _auth.canCheckBiometrics;
    } on PlatformException catch (e) {
      log(e.toString());
      return false;
    }
  }

  Future<bool> authenticate() async {
    final isAvailable = await hasBiometrics();
    if (!isAvailable) biometricOnly = false;

    try {
      return await _auth.authenticate(
        localizedReason: 'Autenticação',
        options: AuthenticationOptions(
          useErrorDialogs: true,
          biometricOnly: biometricOnly,
        ),
      );
    } on PlatformException catch (e) {
      log(e.toString());
      return false;
    }
  }
}

```

A função hasBiometrics() faz essa checagem, e retorna se é possível autenticar por biometrias.&#x20;

Já a função authenticate(), faz essa chamada acima, e se for possível checar a biometria, ele faz a chamada do plugin para autenticar de fato, tendo um retorno booleano para checar se autenticou ou não.

Nesta função, é possível perceber o parametro biometricOnly, ele é quem define se será possível para o usuário autenticar com a senha do celular ou apenas com as possíveis biometrias cadastradas.&#x20;

No exemplo abaixo, vou mostrar como fiz esse uso, possibilitando ao usuário clicar em um botão para usar a senha do celular, e alterando este valor de biometricOnly.

Dentro de uma tela inicial, faço as seguintes chamadas:

```dart
bool isAuthenticated = false;
  
  final LocalAuthApi _localAuth = GetIt.I.get<LocalAuthApi>();

  void checkAuth() async {
    isAuthenticated = await _localAuth.authenticate();

    if (isAuthenticated) {
      Navigator.of(context).pushReplacementNamed(
        SkeletonApp.routeName,
      );
    }
  }

  @override
  void didChangeDependencies() {
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
      checkAuth();
    });

    super.didChangeDependencies();
  }
```

Ou seja, caso o usuário seja de cara autenticado quando abrir a tela, já segue seu redirecionamento normal para o uso do app.

E caso ele não consiga se autenticar pela biometria, existe um botão na tela, para alterar o valor de biometricOnly:

```dart
 DefaultButton(
                  text: "Entrar usando a senha do celular",
                  fill: true,
                  color: CustomColors.white,
                  textColor: CustomColors.primary,
                  onTap: () async {
                    _localAuth.biometricOnly = false;
                    checkAuth();
                  },
                ),
```

E é basicamente isso, o uso é realmente simples, mas acredito que muito útil e interessante. Pode ser usado em vários contextos, dentro de algumas features, para o APP todo, da maneira que for necessário.

Na documentação do plugin é demonstrado várias outras funcionalidades e possibilidades, é legal dar uma olhada para maior aprofundamento.
