Biometric을 이용한 지문 인식 사용
Andorid API 23.. 즉, 마시멜로우 버전부터는 안드로이드 기기에 탑재되어 있는 지문인식 센서를 사용할 수 있게 되어있습니다. 그러나 28 버전인 Pie 버전부터 Deprecated 되었습니다. 이유는 최신 기종의 스마트폰은 다양한 생체 정보를 활용할 수 있는 센서들이 장착되어있기 때문입니다. 이에 따라서 Google은 지문 인식 뿐만 아니라 홍체 인식, 얼굴 인식 등의 정보를 활용할 수 있는 BioMetricPrompt를 제공합니다.
BiometricPrompt를 사용하는 이유는 이 뿐만이 아닙니다. 이전의 안드로이드는 센서 정보만 제공했기 때문에 지문인증 레이아웃의 구성이 개발자나 디자이너에 따라 모두 달랐습니다. 하나의 통합된 레이아웃을 제공하는 iOS와는 전혀 달랐습니다. 이렇기에 사용자들은 생체 정보를 제공함에 있어서 신뢰감을 갖지 못하고 프라이버시에 대해 좋은 느낌을 제공하지는 못했습니다. 하지만 BiometricPrompt를 사용하면서 하나의 통일된 UI를 제공하게 됨으로써 사용자들에게 신뢰감을 안겨줄 수 있게 되었습니다.
서론이 길었네요. 바로 시작하겠습니다.
의존성 추가
BiometricPrompt를 사용하려면 최소SDK 버전이 상당히 높습니다. 하지만 하위 버전 호환을 위해 의존성을 추가해 주면 해결할 수 있습니다. build.gradle(:app)에 추가합니다.
implementation 'androidx.biometric:biometric:1.0.1'
생체 정보를 사용할 수 있는지 확인
사용하기 전에 먼저 생체 정보를 사용할 수 있는 기기인지 확인하여야 합니다. 이러한 과정 없이 진행하게 되면, 센서가 없는 기기들에서는 앱 강제 종료가 됩니다. 정보 확인을 통해 예외처리를 하고 다른 인증수단을 사용할 수 있도록 유도하여야 합니다. 이 때 사용하는 것이 BiometricManager입니다.
private var status: Int? = null
...
status = BiometricManager.from(this).canAuthenticate()
if (status == BiometricManager.BIOMETRIC_SUCCESS) {
//사용 가능
} else {
//사용 불가능
}
status는 Integer 변수입니다.
위 소스는 사용 가능이냐 불가능 이냐 판단만 하였으나, 위 사진을 참고하여 추가적으로 예외처리를 하여 사용자들에게 더 정확한 데이터를 전달해 주시면 좋습니다.
생체 정보 인증 다이얼로그 생성
private fun createPromptInfo(): BiometricPrompt.PromptInfo {
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("생체정보로 결제")
.setSubtitle("구매상품: 아이스 아메리카노 외 2개")
.setDescription("결제 진행을 위해 생체 정보를 입력시켜주세요.")
.setConfirmationRequired(false)
.setNegativeButtonText(getString(R.string.prompt_info_use_app_password))
.build()
return promptInfo
}
일단 createPromptInfo 함수를 생성하여 생체 정보 인증을 띄우게 될 Dialog에 대한 정보들을 입력합니다. 여기서 사용되는 함수들의 정보는 여기서 추가로 확인하시기 바랍니다.
생체 정보 제공 후 데이터를 받을 콜백함수 작성
private fun createBiometricPrompt(): BiometricPrompt {
val executor = ContextCompat.getMainExecutor(this)
val callback = object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Log.d(TAG, "$errorCode :: $errString")
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Log.d(TAG, "인증 실패")
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
Log.d(TAG, "인증 성공")
//인증 완료 시 작업
}
}
//The API requires the client/Activity context for displaying the prompt view
val biometricPrompt = BiometricPrompt(this, executor, callback)
return biometricPrompt
}
정말 간단합니다. 위 소스는 단순히 지문 정보가 맞는가만 판단하는 소스입니다. onAuthenticationSucceeded에서 result.cryptoObject를 사용해 보안 요소를 이용하여 암호화를 할 수 있습니다. (해당 내용은 다음에 포스팅 하도록 하겠습니다.)
이제 필요한 함수들을 모두 작성했으니 Dialog를 띄워 인증 과정을 진행해 봅시다.
private lateinit var biometricPrompt: BiometricPrompt
private lateinit var promptInfo: BiometricPrompt.PromptInfo
...
override fun onCreate(savedInstanceState: Bundle?) {
...
biometricPrompt = createBiometricPrompt()
promptInfo = createPromptInfo()
...
btnAuth.setOnClickListener { biometricPrompt.authenticate(promptInfo) }
...
}
음.. 놀랍게도 끝이 났습니다.
끝.
'Android' 카테고리의 다른 글
Android 아키텍처 컴포넌트를 사용한 구조 개선 (0) | 2020.04.03 |
---|---|
'onMessageReceived' overrides nothing 해결 (1) | 2020.03.30 |
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (2) (0) | 2020.02.12 |
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (1) (0) | 2020.02.10 |
DataBinding 오류 해결 (0) | 2020.02.01 |
댓글
이 글 공유하기
다른 글
-
Android 아키텍처 컴포넌트를 사용한 구조 개선
Android 아키텍처 컴포넌트를 사용한 구조 개선
2020.04.03 -
'onMessageReceived' overrides nothing 해결
'onMessageReceived' overrides nothing 해결
2020.03.30 -
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (2)
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (2)
2020.02.12 -
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (1)
Bitbucket Pipeline + Telegram Bot으로 App 자동 빌드/배포 하기 (1)
2020.02.10