반응형
서론
UPbit.. 카뱅, kbank 뭐 여러 어플에 로그인하려면 마주치는 이것
FACE ID, TOUCH ID 아시죠??
분명 FACE ID가 나왔을 때 android에는 touch id 밖에 없었던 것 같은데 암튼..
안드로이드 버전 업을 했떠니 이제 face id 도 있더라구요? 이름하야 생체 인식 - 얼굴 인식
이구요 하드웨어에 맞게 아직까지 터치 아이디도 있다는 점
아무튼 누군가가 기기를 훔쳤을 때, 민감한 정보를 보호할 수 있는 장점이 있는 인증 보조 장치? 라고 보면 됨
이를 일단 구현하는건 의존성 추가만 하면 뚝딱!
하지만 보안 패턴이 다양하고, 기기마다 이 보안을 기호에 맞게 설정하기 때문에 여러 경우에 예외처리를 해줘야 하는 부분이 있습니다. (블루투스나 헬스커넥트랑 비슷)
https://source.android.com/docs/security/features/biometric?hl=ko
본론
클래스로 구현했는데 일단
의존성 추가 24.12.12 기준
implementation("androidx.biometric:biometric:1.2.0-alpha05")
추가하고 로직순서를 보면
1. 해당 기기에 보안 잠금이 있는지 확인. 없으면 그냥 통과 처리.
2. 보안 잠금이 있다면, 인증 성공, 하드웨어 없음, 하드웨어 오류, 기기 인증 실패 등으로 나눌 수 있음 어차피 다 onError임
3. 인증 성공에 대한 callback함수를 통해 결과에 대해 처리를 하는 과정.
하는 프로세스.
이렇게 클래스로 만들고
class BiometricManager(private val fragment: Fragment) {
private val biometricManager: BiometricManager = BiometricManager.from(fragment.requireContext())
private val keyguardManager: KeyguardManager =
fragment.requireContext().getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
private fun isDeviceSecure(): Boolean {
return try {
keyguardManager.isDeviceSecure
} catch (e: Exception) {
Log.e("BiometricAuth", "Device security check failed", e)
false
}
}
private fun checkDeviceCredentialStatus(): Int {
return try {
biometricManager.canAuthenticate(
BiometricManager.Authenticators.DEVICE_CREDENTIAL or
BiometricManager.Authenticators.BIOMETRIC_WEAK
)
} catch (e: Exception) {
Log.e("BiometricAuth", "Device credential check failed", e)
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE
}
}
fun authenticate(
onSuccess: () -> Unit,
onError: (String) -> Unit,
fallbackToDeviceCredential: Boolean = true
) {
Log.v("BiometricAuth", "Authentication started")
Log.v("BiometricAuth", "Device secure: ${isDeviceSecure()}")
// 디바이스에 보안 설정이 전혀 없는 경우 바로 성공 처리
if (!isDeviceSecure()) {
Log.v("BiometricAuth", "No device security, bypassing authentication")
onSuccess()
return
}
// 디바이스 자격 증명 상태 확인
val deviceCredentialStatus = checkDeviceCredentialStatus()
Log.v("BiometricAuth", "Device credential status: $deviceCredentialStatus")
when (deviceCredentialStatus) {
BiometricManager.BIOMETRIC_SUCCESS -> {
promptDeviceCredential(onSuccess, onError)
}
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
onError("기기 인증 하드웨어가 없습니다.")
}
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> {
onError("기기 인증 하드웨어를 사용할 수 없습니다.")
}
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
if (fallbackToDeviceCredential) {
onError("기기 인증 방법이 등록되지 않았습니다.")
} else {
onError("기기 인증을 사용할 수 없습니다.")
}
}
else -> {
onError("알 수 없는 오류가 발생했습니다.")
}
}
}
private fun promptDeviceCredential(onSuccess: () -> Unit, onError: (String) -> Unit) {
Log.v("BiometricAuth", "Prompting device credential")
val executor = ContextCompat.getMainExecutor(fragment.requireContext())
val biometricPrompt = BiometricPrompt(
fragment,
executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
Log.v("BiometricAuth", "Device credential authentication succeeded")
onSuccess()
}
override fun onAuthenticationFailed() {
Log.e("BiometricAuth", "Device credential authentication failed")
onError("기기 인증에 실패했습니다.")
}
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
Log.e("BiometricAuth", "Device credential authentication error: $errorCode - $errString")
onError("기기 인증 중 오류가 발생했습니다: $errString")
}
}
)
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("기기 인증")
.setSubtitle("PIN, 패턴 또는 비밀번호로 인증해주세요")
.setDeviceCredentialAllowed(true)
.build()
biometricPrompt.authenticate(promptInfo)
}
}
private lateinit var biometricManager : BiometricManager
...
biometricManager = BiometricManager(this)
biometricManager.authenticate(
onSuccess = {}
onError = {}
)
이렇게 context가 사용 가능한 Activity, Fragment, DialogFragment 어디서든지 가져와서 붙여주면 사용 완료
생각보다 간단함. 모든건 저 BiometricManager가 다하는 중 ㅋㅋ
ㅅㄱ
반응형
'개발 > android_kotlin' 카테고리의 다른 글
[ kotlin ] 안드로이드 종료 감지 (화면 종료, 앱 종료) (0) | 2024.12.12 |
---|---|
[ Kotlin ] 기능 구현 완료 후 방향 (0) | 2024.11.18 |
[ Kotlin ] 안드로이드 Compose - State, ViewModel (0) | 2024.11.13 |
[ Kotlin ] Compose - 레이아웃만들기(material icon과 modifier 등) (0) | 2024.11.13 |
[ Kotlin ] 라이브러리 의존성 문제 (구버전들) (1) | 2024.11.12 |