🔓Local Auth
Nesta seção será descrito o uso do plugin local_auth, para autenticação local em aplicativos, ou seja, permitir a entrada na aplicação a partir da senha do celular, impressão digital ou face ID.
Este plugin é 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.
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.
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.
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:
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:
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.
Last updated