نحوه احراز هویت به صورت Biometric در اندروید

ترجمه و تالیف : پوریا شریفی
تاریخ انتشار : 10 مرداد 99
خواندن در 2 دقیقه
دسته بندی ها : اندروید

احراز هویت بیومتریک، نسخه توسعه داده شده احراز هویت با اثر انگشت است. Api بیومتریک بسیار ساده‌تر و پیشرفته‌تر در مقایسه با نسخه قبلی خود است. در این مقاله شما نحوه استفاده و ادغام Api بیومتریک را خواهید آموخت.

مقدمه

در سال‌های اخیر تمرکز تیم اندروید بیشتر روی بهبود امنیت و حفظ حریم شخصی بوده است. قفل الگو/ پین سال‌ها است که در اندروید قرار دارد و به عنوان پیشرفت احراز هویت با اثر انگشت نیز از چند سال پیش معرفی شد. اکنون زمان آن رسیده است که پیشرفت‌هایی در تایید اثر انگشت داشته و به عنوان احراز هویت بیومتریک شناخته شود.

احراز هویت بیومتریک ایمن‌تر و استفاده از آن ساده‌تر است، که در بسیاری از مواقع مانند مجوز برای پرداخت، ورود ایمن و ساده، تایید اعتبار هنگام دسترسی به داده‌های حساس و موارد دیگر بسیار مفید است.

علاوه بر آن، Api بیومتریک همچنین راهی برای تایید اعتبار با پین یا گذرواژه بدون هیچ کار اضافی برای توسعه دهندگان فراهم می‌کند.

بررسی در دسترس بودن

همانطور که گفتم سیستم امنیتی اندروید با قفل پین و گذرواژه شروع به کار کرد، بنابراین برخی از دستگاه‌ها قابلیت باز کردن با اثر انگشت یا تصویر صورت را ندارند. قبل از فعال کردن این نوع تایید اعتبار برای کاربر بهتر است بررسی کنید که آیا دستگاه با احراز بیومتریک سازگار است یا نه.

برای بررسی در دسترس بودن ابتدا باید نمونه‌ای از کلاس BiometricManager را همانند زیر ایجاد کنید:

val biometricManager = BiometricManager.from(this)

با نمونه ایجاد شده از BiometricManager، باید تابع عمومی canAuthenticate() را فراخوانی کنیم که نتیجه آن یک عدد صحیح است.

تابع canAuthenticate() چهار نتیجه ممکن دارد:

  • BIOMETRIC_SUCCESS: دستگاه می‌تواند با احراز هویت بیومتریک کار کند
  • BIOMETRIC_ERROR_NO_HARDWARE: هیچ ویژگی بیومتریکی در این دستگاه وجود ندارد
  • BIOMETRIC_ERROR_HW_UNAVAILABLE: ویژگی بیومتریک در حال حاضر در دستگاه در دسترس نیست
  • BIOMETRIC_ERROR_NONE_ENROLED: کاربر هنوز هیچ اعتبار بیومتریکی برای دستگاه قرار نداده است

از قدرت when در کاتلین هنگام کار با موارد فوق استفاده کنید:

private fun verfiyingBioMetricExistence() {
    when (biometricManager.canAuthenticate()) {
        BiometricManager.BIOMETRIC_SUCCESS ->
            "App can authenticate using biometrics.".print()
        BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
            "No biometric features available on this device.".print()
        BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
            "Biometric features are currently unavailable.".print()
        BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
            "The user hasn't associated any biometric credentials with their account.".print()
    }
}

ادغام

ادغام کتابخانه بیومتریک ساده است. باید خط زیر را در زیر تگ build.gradle همانند زیر اضافه کنیم:

dependencies {
    implementation 'androidx.biometric:biometric:1.0.1'
}

میتوانید از طریق این لینک آخرین نسخه آن را مشاهده کنید.

کار با کتابخانه بیومتریک

بالاخره به بخش مهیج رسیدیم. ابتدا باید نمونه‌ای از Exector همانند زیر ایجاد کنیم:

val executor = ContextCompat.getMainExecutor(this)

getMainExactor، Exactor را برمی‌گرداند که کارهای مرتبط با context را در thread اصلی اجرا می‌کند. این thread برای ارسال فراخوانی‌ها به مولفه‌های برنامه(اکتیویتی، سرویس و غیره) استفاده می‌شود. این Exactor برای ایجاد پلی بین خدمات بیومتریک و اجزای برنامه شما استفاده می‌شود.

در مرحله بعد، ما باید نمونه‌ای از BiometricPrompt ایجاد کنیم، که همانطور در زیر مشاهده می‌کنید می‌توانید احراز هویت کاربر را انجام دهید. که سه آرگومان دارد:

  1. نمونه‌ای از مولفه‌های اندروید(اکتیویتی/فرگمنت)
  2. Exactor که در بالا ایجاد کردیم
  3. عبارت لامبدا با سه callback به نام Biometric.AuthenticationCallback
biometricPrompt = BiometricPrompt(this, executor,
                object : BiometricPrompt.AuthenticationCallback() {
                    override fun onAuthenticationError(errorCode: Int,
                                                       errString: CharSequence) {
                        super.onAuthenticationError(errorCode, errString)
                        Toast.makeText(applicationContext,
                                "Authentication error: $errString", Toast.LENGTH_SHORT)
                                .show()
                    }

                    override fun onAuthenticationSucceeded(
                            result: BiometricPrompt.AuthenticationResult) {
                        super.onAuthenticationSucceeded(result)
                        Toast.makeText(applicationContext,
                                "Authentication succeeded!", Toast.LENGTH_SHORT)
                                .show()
                    }

                    override fun onAuthenticationFailed() {
                        super.onAuthenticationFailed()
                        Toast.makeText(applicationContext, "Authentication failed",
                                Toast.LENGTH_SHORT)
                                .show()
                    }
                })

زمان آن رسیده که اطلاعات لازم را از طریق سازنده PromptInfo به Prompt مانند زیر ارسال کنیم:

promptInfo = BiometricPrompt.PromptInfo.Builder()
       .setTitle("Biometric login for my app")
       .setSubtitle("Log in using your biometric credential")
       .build()

تنها چیزی که باقی مانده این است که دیالوگ بیومتریک را با استفاده از authenticate در BiometricPrompt با پاس دادن promptInfo به عنوان پارامتر ورودی نشان دهیم.

biometricPrompt.authenticate(promptInfo)

کار تمام است، بقیه کارها توسط Api بیومتریک انجام می‌شود و نتیجه توسط callbackها به ما ارائه می‌شود.

برای درک دقیق‌تر آن، کد زیر را ببینید که تمام قطعات در کنار هم قرار گرفته‌اند:

private lateinit var executor: Executor
private lateinit var biometricPrompt: BiometricPrompt
private lateinit var promptInfo: BiometricPrompt.PromptInfo
private fun showBiomertricDialog(){
    executor =
           ContextCompat.getMainExecutor(this)
    biometricPrompt = BiometricPrompt(this, executor,
            object : BiometricPrompt.AuthenticationCallback() {
                override fun onAuthenticationError(errorCode: Int,
                                                   errString: CharSequence) {
                    super.onAuthenticationError(errorCode, errString)

                    Toast.makeText(applicationContext,
                            "Authentication error: $errString", Toast.LENGTH_SHORT)
                            .show()
                }

                override fun onAuthenticationSucceeded(
                        result: BiometricPrompt.AuthenticationResult) {
                   super.onAuthenticationSucceeded(result)
                   Toast.makeText(applicationContext,
                            "Authentication succeeded!", Toast.LENGTH_SHORT)
                            .show()
                }

                override fun onAuthenticationFailed() {
                    super.onAuthenticationFailed()
                    Toast.makeText(applicationContext, "Authentication failed",
                            Toast.LENGTH_SHORT)
                            .show()
                }
            })

    promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle("Biometric login for my app")
            .setSubtitle("Log in using your biometric credential")
            .build()
    biometricPrompt.authenticate(promptInfo)

}

فعال کردن گزینه Password

مواقعی وجود خواهد داشت که گزینه اثر انگشت یا تشخیص چهره شما دارای مشکل باشد. به عنوان مثال هنگامی که نور کافی برای تشخیص چهره وجود ندارد، و ممکن است که آن‌طور که تصور می‌شود کار نکند. در شرایطی از این دست، کاربر باید بتواند از حالت‌های دیگر تایید اعتبار مانند پین/الگو/گذرواژه استفاده کند.

برای فعال کردن آن، در کتابخانه بیومتریک یک تابع به نام setDeviceCredentionAllowed در نمونه‌ Biometricinfo.PromptInfo قرار دارد که با پاس دادن مقدار True به آن همانند زیر انجام می‌شود:

promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        // Allows device pin
        .setDeviceCredentialAllowed(true)
        .build()

منبع

گردآوری و تالیف پوریا شریفی
آفلاین
user-avatar

ابتدا که با برنامه‌نویسی آشنا شدم به سمت php و طراحی وب رفتم، بعد از اون به توسعه‌ی اندروید علاقه‌مند شدم و تقریبا ۲ سال است که مشغول به برنامه‌نویسی اندروید هستم، همچنین عاشق یادگیری چیزهای جدید هستم.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید