[Flutter] local_auth 지문인증, 얼굴인증

김영진·2021년 12월 8일
2

Flutter 앱 개발 일기

목록 보기
19/31

목적

앱에 지문, 얼굴인증을 위해 리서치를 진행하였다.

내용

local_auth 플러그인은 local, on-device 인증을 제공한다.

ios 생체 인증(touch ID or lock code), android 6.0 이후의 지문인식을 의미한다.


사용법

  1. 임포트
 import 'package:local_auth/local_auth.dart';
  1. 생체인증이 가능한지 확인하는법
bool canCheckBiometrics = await localAuth.canCheckBiometrics;
  1. 생체인증 종류
    • 얼굴
    • 지문

  2. 등록된 바이오인증 목록을 얻으려면 getAvailableBiometrics를 요청하세요.
List<BiometricType> availableBiometrics = await auth.getAvailableBiometrics();

if (Platform.isIOS) {
    if (availableBiometrics.contains(BiometricType.face)) {
        // Face ID.
    } else if (availableBiometrics.contains(BiometricType.fingerprint)) {
        // Touch ID.
    }
}
  1. 인증 에러가 나는 2가지 경우

    1. Passcode/PIN/Pattern 이 설정되지 않은경우
    2. 지문이 등록되지 않은경우

    유저의 기기에 지문이 없으면 유저가 지문을 설정할 수 있는 설명서가 뜬다.
    확인을 누르면 false가 리턴된다.

    로컬 인증을 디폴트 팝업(authenticate() 메소드는 생체인증을 사용할 뿐만아니라 유저가 핀, 패턴, 비밀번호를 사용하도록 허럭한다)으로 유발하기 위해서는 API를 export 해야한다.
    로그인하게 할려면 아래와 같이 쓰면된다

    var localAuth = LocalAuthentication();
    bool didAuthenticate = await localAuth.authenticate(
        localizedReason: 'Please authenticate to show account balance');

    생체인증만 사용할려면

    var localAuth = LocalAuthentication();
    bool didAuthenticate = await localAuth.authenticate(
        localizedReason: 'Please authenticate to show account balance',
        biometricOnly: true,
    );

    기본 팝업창을 사용하지 않으려면

    bool didAuthenticate = await localAuth.authenticate(
        localizedReason: 'Please authenticate to show account balance',
        useErrorDialogs: false);

    디폴트 팝업창, ios or android 에서 넘어온 너만의 팝업창을 사용할 수 있다.

    import 'package:local_auth/auth_strings.dart';
    
    const iosStrings = const IOSAuthMessages(
        	cancelButton: 'cancel',
    	goToSettingsButton: 'settings',
    	goToSettingsDescription: 'Please set up your Touch ID.',
    	lockOut: 'Please reenable your Touch ID');
    
    await localAuth.authenticate(
    	localizedReason: 'Please authenticate to show account balance',
    	useErrorDialogs: false,
    	iOSAuthStrings: iosStrings);

    필요한 경우 android 인증을 수동으로 중지할 수 있다.

    void _cancelAuthentication() {
        localAuth.stopAuthentication();
    }

    예외들

    • PasscodeNotSet
    • NotEnroll
    • NotAvailable
    • OtherOperatingSystem
    • LockedOut
    • PermanetallyLockedOut

    LocalAuthenticationError 클래스로 래핑됩니다.

    에러 핸들링 예제
    import 'package:flutter/services.dart';
    import 'package:local_auth/error_codes.dart' as auth_error;
    
    try {
      bool didAuthenticate = await local_auth.authenticate(
      localizedReason: 'Please authenticate to show account balance');
    } on PlatformException catch (e) {
      if (e.code == auth_error.notAvailable) {
    // Handle this exception here.
      }
    }

    IOS 통합

    이 플러그인은 Touch ID 및 Face ID 모두에서 작동하지만, Face ID를 사용하려면 다음 항목도 추가해야 합니다.
    Inpo.plist 파일에 추가해야함, 추가하지 않을경우 사용자에게 Face ID를 사용할수있도록 앱이 업데이트 되지 않았다고 알려줌.

    <key>NSFaceIDUsageDescription</key>
    <string>Why is my app authenticating using face id?</string>

    Android 통합

    local_auth 플러그인은 Activity가 아닌 FragmentActivity를 사용해야 합니다.
    FlutterFragmentActivity로 FlutterActivity를 매니패스트에서 바꾸면 됩니다.

    JAVA
    import android.os.Bundle;
    import io.flutter.app.FlutterFragmentActivity;
    import io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin;
    import io.flutter.plugins.localauth.LocalAuthPlugin;
    
    public class MainActivity extends FlutterFragmentActivity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
        	super.onCreate(savedInstanceState);
        	FlutterAndroidLifecyclePlugin.registerWith(
        		registrarFor("io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin"));
        		LocalAuthPlugin.registerWith(registrarFor("io.flutter.plugins.localauth.LocalAuthPlugin"));
             }
    }
    Kotlin
    import io.flutter.embedding.android.FlutterFragmentActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugins.GeneratedPluginRegistrant
    
    class MainActivity: FlutterFragmentActivity() {
    	override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        		GeneratedPluginRegistrant.registerWith(flutterEngine)
    	}
    }
프로젝트의 AndroidManifest.xml 파일을 업데이트 하여 USE_FINGERPRINT 권한을 포함합니다.
  
  <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app">
  	<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
  <manifest>
  
안드로이드에서는 API29(Android Q)이전 버전의 지문 하드웨어만 인식할수 있습니다. 따라서 얼굴 스캔과 같은 다른 생체 인식 유형을 지원하고 Q보다 낮은 SDK를 지원하려면 getAvailableBiometrics를 호출하지 마십시오. biometricsOnly: true

너는 stickyAuth 옵션을 플러그인에서 true로 설정할 수 있습니다. 만약 앱이 백그라운드에 갔다오면 failure를 리턴한다. 백그라운드로 가는상황은 유저가 전화를 받거나 할때 일어날 수 있다.
stickyAuth를 false로 설정하면 이것은 앱이 재실행 되었을때 플러그인 인증을 재시도 한다.
profile
2021.05.03) Flutter, BlockChain, Sports, StartUp

0개의 댓글