احراز هویت با Firebase در Android بااستفاده از شماره تلفن

می‌توانید از Firebase Authentication برای ورود به سیستم کاربر با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر بااستفاده از کد یک‌بارمصرف موجود در پیامک به سیستم وارد می‌شود.

ساده‌ترین راه برای افزودن ورود به سیستم با شماره تلفن به برنامه، استفاده از FirebaseUI است، که شامل ابزارک ورود به سیستم آماده‌ای است که جریان‌های ورود به سیستم را برای ورود به سیستم با شماره تلفن، و همچنین ورود به سیستم فدرال و مبتنی بر گذرواژه پیاده‌سازی می‌کند. این سند نحوه پیاده‌سازی جریان ورود به سیستم با شماره تلفن را بااستفاده از «کیت توسعه نرم‌افزار Firebase» شرح می‌دهد.

قبل از شروع

  1. اگر قبلاً این کار را نکرده‌اید، Firebase را به پروژه Android خود اضافه کنید.
  2. در فایل Gradle واحد (سطح برنامه) (معمولاً <project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle)، وابستگی کتابخانه Firebase Authentication را برای Android اضافه کنید. توصیه می‌کنیم از Firebase Android BoM برای کنترل نسخه‌بندی کتابخانه استفاده کنید.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:35.0.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    بااستفاده از Firebase Android BoM، برنامه شما همیشه از نسخه‌های سازگار کتابخانه‌های Firebase Android استفاده خواهد کرد.

    (جایگزین)  افزودن وابستگی‌های کتابخانه Firebase بدون استفاده از BoM

    اگر انتخاب کنید که از Firebase BoM استفاده نکنید، باید نسخه هر کتابخانه Firebase را در خط وابستگی آن مشخص کنید.

    توجه داشته باشید که اگر از چند کتابخانه Firebase در برنامه‌تان استفاده می‌کنید، قویاً توصیه می‌کنیم از BoM برای مدیریت نسخه‌های کتابخانه استفاده کنید، که تضمین می‌کند همه نسخه‌ها سازگار باشند.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:25.0.0")
    }
  3. اگر هنوز برنامه‌تان را به پروژه Firebase متصل نکرده‌اید، این کار را از کنسول Firebase انجام دهید.
  4. اگر قبلاً در Firebase کنسول مقدار درهم‌سازی SHA-1 برنامه را تنظیم نکرده‌اید، این کار را انجام دهید. برای کسب اطلاعات درباره یافتن درهم‌سازی SHA-1 برنامه، «اصالت‌سنجی مشتری» را ببینید.

نگرانی‌های امنیتی

اصالت‌سنجی فقط بااستفاده از شماره تلفن، اگرچه راحت است، اما نسبت به روش‌های موجود دیگر امنیت کمتری دارد، زیرا مالکیت شماره تلفن به‌راحتی می‌تواند بین کاربران منتقل شود. همچنین در دستگاه‌هایی که چند نمایه کاربر دارند، هر کاربری که بتواند پیامک دریافت کند می‌تواند بااستفاده از شماره تلفن دستگاه به سیستم حساب وارد شود.

اگر در برنامه‌تان از ورود به سیستم براساس شماره تلفن استفاده می‌کنید، باید آن را درکنار روش‌های امن‌تر ورود به سیستم ارائه دهید و کاربران را از معاوضه‌های امنیتی استفاده از ورود به سیستم با شماره تلفن مطلع کنید.

ورود به سیستم با شماره تلفن را برای پروژه Firebase خود فعال کنید

برای وارد کردن کاربران به سیستم ازطریق پیامک، ابتدا باید روش «ورود به سیستم با شماره تلفن» را برای پروژه Firebase خود فعال کنید:

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  2. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم تلفن را فعال کنید.
  3. خط‌مشی‌ای برای مناطقی که می‌خواهید ارسال پیامک به آن‌ها مجاز یا غیرمجاز باشد تنظیم کنید. تنظیم خط‌مشی منطقه پیامک می‌تواند به محافظت از برنامه‌هایتان دربرابر سوءاستفاده از پیامک کمک کند. برای پروژه‌های جدید، خط‌مشی پیش‌فرض هیچ منطقه‌ای را مجاز نمی‌داند.
    1. در کنسول Firebase، به امنیت > اصالت‌سنجی > زبانه تنظیمات بروید.
    2. در بخش خط‌مشی منطقه پیامک، خط‌مشی منطقه پیامک را تنظیم کنید.

فعال کردن درستی‌سنجی برنامه

برای استفاده از اصالت‌سنجی شماره تلفن، Firebase باید بتواند درستی‌سنجی کند که درخواست‌های ورود به سیستم با شماره تلفن از برنامه شما می‌آید. Firebase Authentication این کار را به سه روش انجام می‌دهد:

  • Play Integrity API: اگر کاربری دستگاهی داشته باشد که Google Play services در آن نصب شده باشد، و Firebase Authentication بتواند با Play Integrity API، قانونی بودن دستگاه را تأیید کند، ورود به سیستم با شماره تلفن می‌تواند ادامه یابد. ‫Play Integrity API در پروژه تحت مالکیت Google توسط Firebase Authentication فعال شده است، نه در پروژه شما. این کار به هیچ‌یک از سهمیه‌های Play Integrity API در پروژه شما کمک نمی‌کند. «پشتیبانی از تمامیت Play» با Authentication کیت توسعه نرم‌افزار نسخه ۲۱.۲.۰ و بالاتر (Firebase BoM نسخه ۳۱.۴.۰ و بالاتر) دردسترس است.

    برای استفاده از «تمامیت Play»، اگر قبلاً اثرانگشت SHA-256 برنامه خود را مشخص نکرده‌اید، آن را مشخص کنید.

    1. در کنسول Firebase، به تنظیمات > زبانه کلی بروید.
    2. به کارت برنامه‌های شما پیمایش کنید، برنامه Android خود را انتخاب کنید، و اثر انگشت SHA-256 خود را در فیلد اثر انگشت گواهینامه SHA اضافه کنید.

    برای جزئیات مربوط به نحوه دریافت اثر انگشت SHA برنامه، اصالت‌سنجی مشتری را ببینید.

  • درستی‌سنجی reCAPTCHA: درصورتی‌که نتوان از «تمامیت Play» استفاده کرد، مثلاً وقتی کاربر دستگاهی بدون Google Play services نصب‌شده داشته باشد، Firebase Authentication از درستی‌سنجی reCAPTCHA برای تکمیل جریان ورود به سیستم با تلفن استفاده می‌کند. چالش reCAPTCHA اغلب می‌تواند بدون نیاز به حل کردن چیزی توسط کاربر تکمیل شود. توجه داشته باشید که این جریان نیازمند آن است که SHA-1 با برنامه شما مرتبط باشد. این جریان همچنین نیاز دارد که «کلید API» شما برای PROJECT_ID.firebaseapp.com بدون محدودیت یا در فهرست مجاز قرار داشته باشد.

    برخی‌از سناریوهایی که در آن‌ها reCAPTCHA راه‌اندازی می‌شود:

    • اگر دستگاه کاربر نهایی Google Play services را نصب نداشته باشد.
    • اگر برنامه ازطریق Google Play Store توزیع نشود (در Authentication SDK نسخه ۲۱.۲.۰ و بالاتر).
    • اگر نشان SafetyNet دریافت‌شده معتبر نباشد (در نسخه‌های Authentication کیت توسعه نرم‌افزار < v21.2.0).

    وقتی از SafetyNet یا Play Integrity برای «درستی‌سنجی برنامه» استفاده می‌شود، فیلد %APP_NAME% در الگوی پیامک با نام برنامه‌ای که از Google Play Store تعیین شده است تکمیل می‌شود. در سناریوهایی که reCAPTCHA راه‌اندازی می‌شود، %APP_NAME% به‌عنوان PROJECT_ID.firebaseapp.com تکمیل می‌شود.

می‌توانید جریان درستی‌سنجی reCAPTCHA را با forceRecaptchaFlowForTesting اجبار کنید می‌توانید درستی‌سنجی برنامه را (هنگام استفاده از شماره تلفن‌های ساختگی) با setAppVerificationDisabledForTesting غیرفعال کنید.

عیب‌یابی

  • خطای «وضعیت اولیه وجود ندارد» هنگام استفاده از reCAPTCHA برای درستی‌سنجی برنامه

    این مشکل زمانی رخ می‌دهد که جریان reCAPTCHA با موفقیت تکمیل شود اما کاربر را به برنامه بومی هدایت نکند. اگر این اتفاق بیفتد، کاربر به نشانی وب جایگزین PROJECT_ID.firebaseapp.com/__/auth/handler هدایت می‌شود. در مرورگرهای Firefox، باز کردن پیوندهای برنامه بومی به‌طور پیش‌فرض غیرفعال است. اگر خطای بالا را در Firefox مشاهده کردید، مراحل تنظیم Firefox برای Android برای باز کردن پیوندها در برنامه‌های بومی را دنبال کنید تا باز کردن پیوندهای برنامه را فعال کنید.

کد درستی‌سنجی به تلفن کاربر ارسال شود

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

سپس شماره تلفن او را به روش PhoneAuthProvider.verifyPhoneNumber ارسال کنید تا از Firebase بخواهید شماره تلفن کاربر را درستی‌سنجی کند. برای مثال:

Kotlin

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

روش verifyPhoneNumber مجددپذیر است: اگر آن را چندین بار فراخوانی کنید، مثلاً در روش onStart فعالیت، روش verifyPhoneNumber پیامک دوم را ارسال نخواهد کرد، مگر اینکه درخواست اصلی منقضی شده باشد.

اگر برنامه شما قبل‌از اینکه کاربر بتواند به سیستم وارد شود بسته شود (برای مثال، زمانی که کاربر از برنامه پیامک خود استفاده می‌کند)، می‌توانید از این رفتار برای ازسر گرفتن فرایند ورود به سیستم با شماره تلفن استفاده کنید. پس‌از تماس با verifyPhoneNumber، پرچمی تنظیم کنید که نشان دهد درستی‌سنجی درحال انجام است. سپس پرچم را در روش onSaveInstanceState «فعالیت» خود ذخیره کنید و پرچم را در onRestoreInstanceState بازیابی کنید. درنهایت، در روش onStart «فعالیت»، بررسی کنید که آیا درستی‌سنجی درحال انجام است یا نه، و اگر درحال انجام است، دوباره verifyPhoneNumber را فراخوانی کنید. وقتی درستی‌سنجی تکمیل یا ناموفق شد، حتماً پرچم را پاک کنید (به بازخوان‌های درستی‌سنجی مراجعه کنید).

برای مدیریت آسان چرخش صفحه‌نمایش و موارد دیگر راه‌اندازی مجدد «فعالیت»، «فعالیت» خود را به روش verifyPhoneNumber منتقل کنید. وقتی «فعالیت» متوقف می‌شود، بازخوان‌ها به‌طور خودکار جدا می‌شوند، بنابراین می‌توانید کد انتقال واسط کاربر را آزادانه در روش‌های بازخوان بنویسید.

پیامک ارسال‌شده توسط Firebase را نیز می‌توان با مشخص کردن زبان احراز هویت ازطریق روش setLanguageCode در نمونه Auth محلی‌سازی کرد.

Kotlin

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

وقتی PhoneAuthProvider.verifyPhoneNumber را فراخوانی می‌کنید، باید نمونه‌ای از OnVerificationStateChangedCallbacks را نیز ارائه دهید که حاوی پیاده‌سازی‌های توابع بازخوانی است که نتایج درخواست را مدیریت می‌کنند. برای مثال:

Kotlin

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

پاسخ‌های تماس درستی‌سنجی

در اکثر برنامه‌ها، onVerificationCompleted، onVerificationFailed، و onCodeSent را پیاده‌سازی می‌کنید. بسته به الزامات برنامه‌تان، ممکن است onCodeAutoRetrievalTimeOut را نیز پیاده‌سازی کنید.

onVerificationCompleted(PhoneAuthCredential)

این روش در دو موقعیت فراخوانده می‌شود:

  • درستی‌سنجی فوری: در برخی موارد، شماره تلفن می‌تواند بدون نیاز به ارسال یا وارد کردن کد درستی‌سنجی، فوراً درستی‌سنجی شود.
  • واکشی خودکار: در برخی‌از دستگاه‌ها، «سرویس‌های Google Play» می‌تواند پیامک درستی‌سنجی ورودی را به‌طور خودکار تشخیص دهد و درستی‌سنجی را بدون اقدام کاربر انجام دهد. (این قابلیت ممکن است در برخی‌از شرکت‌های مخابراتی دردسترس نباشد.) این روش از SMS Retriever API استفاده می‌کند که شامل یک درهم‌سازی ۱۱ نویسه‌ای در انتهای پیامک است.
در هر دو حالت، شماره تلفن کاربر باموفقیت درستی‌سنجی شده است و می‌توانید از شیء PhoneAuthCredential که به بازخوان ارسال شده است برای ورود به سیستم کاربر استفاده کنید.

onVerificationFailed(FirebaseException)

این روش در پاسخ به درخواست درستی‌سنجی نامعتبر، مانند درخواستی که شماره تلفن یا کد درستی‌سنجی نامعتبر را مشخص می‌کند، فراخوانی می‌شود.

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

اختیاری. این روش پس‌از ارسال کد درستی‌سنجی ازطریق پیامک به شماره تلفن ارائه‌شده فراخوانی می‌شود.

وقتی این روش فراخوانده می‌شود، اکثر برنامه‌ها میانای کاربری‌ای نمایش می‌دهند که از کاربر می‌خواهد کد درستی‌سنجی را از پیامک وارد کند. (هم‌زمان، درستی‌سنجی خودکار ممکن است در پس‌زمینه درحال انجام باشد.) سپس، پس‌از اینکه کاربر کد درستی‌سنجی را تایپ کرد، می‌توانید از کد درستی‌سنجی و شناسه درستی‌سنجی که به روش منتقل شده است برای ایجاد شیء PhoneAuthCredential استفاده کنید، که می‌توانید از آن برای ورود به سیستم کاربر استفاده کنید. بااین‌حال، برخی‌از برنامه‌ها ممکن است تا زمانی که onCodeAutoRetrievalTimeOut فراخوانی شود منتظر بمانند و سپس واسط کاربر کد درستی‌سنجی را نمایش دهند (توصیه نمی‌شود).

onCodeAutoRetrievalTimeOut(String verificationId)

اختیاری. این روش پس‌از گذشت مدت زمان وقفه مشخص‌شده برای verifyPhoneNumber بدون اینکه onVerificationCompleted ابتدا راه‌اندازی شود فراخوانده می‌شود. در دستگاه‌های بدون سیم‌کارت، این روش بلافاصله فراخوانی می‌شود زیرا بازیابی خودکار پیامک امکان‌پذیر نیست.

برخی‌از برنامه‌ها ورودی کاربر را تا پایان دوره درستی‌سنجی خودکار مسدود می‌کنند، و فقط پس‌از آن یک واسط کاربر نمایش می‌دهند که از کاربر می‌خواهد کد درستی‌سنجی را از پیامک وارد کند (توصیه نمی‌شود).

ایجاد شیء PhoneAuthCredential

پس‌از اینکه کاربر کد درستی‌سنجی را که Firebase به تلفن کاربر ارسال کرده است وارد کرد، بااستفاده از کد درستی‌سنجی و شناسه درستی‌سنجی که به onCodeSent یا onCodeAutoRetrievalTimeOut برگشت تماس ارسال شده است، شیء PhoneAuthCredential ایجاد کنید. (وقتی onVerificationCompleted فراخوانی می‌شود، مستقیماً PhoneAuthCredential شیء را دریافت می‌کنید، بنابراین می‌توانید از این مرحله رد شوید.)

برای ایجاد شیء PhoneAuthCredential، با PhoneAuthProvider.getCredential تماس بگیرید:

Kotlin

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

کاربر را به سیستم وارد کنید

پس‌از دریافت شیء PhoneAuthCredential، چه در بازخوانی onVerificationCompleted یا با تماس با PhoneAuthProvider.getCredential، با انتقال شیء PhoneAuthCredential به FirebaseAuth.signInWithCredential، جریان ورود به سیستم را تکمیل کنید:

Kotlin

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

آزمایش با شماره تلفن‌های ساختگی

می‌توانید بااستفاده از کنسول Firebase، شماره تلفن‌های ساختگی برای توسعه تنظیم کنید. آزمایش با شماره تلفن‌های ساختگی این مزایا را دارد:

  • بدون مصرف سهمیه استفاده‌تان، اصالت‌سنجی شماره تلفن را آزمایش کنید.
  • اصالت‌سنجی شماره تلفن را بدون ارسال پیامک واقعی آزمایش کنید.
  • بدون اینکه محدود شوید، آزمایش‌های متوالی را با شماره تلفن یکسان اجرا کنید. این کار خطر رد شدن درطول فرایند بازبینی «فروشگاه برنامه‌ها» را به حداقل می‌رساند، زیرا ممکن است بازبین از همان شماره تلفن برای آزمایش استفاده کند.
  • بدون هیچ تلاش اضافه‌ای، در محیط‌های توسعه آزمایش کنید، مثلاً امکان توسعه در شبیه‌ساز iOS یا شبیه‌ساز Android بدون «خدمات Google Play».
  • آزمایش‌های یکپارچه‌سازی را بدون اینکه بررسی‌های امنیتی که معمولاً روی شماره‌های تلفن واقعی در محیط تولید اعمال می‌شود مانع شما شود بنویسید.

شماره‌های تلفن ساختگی باید این الزامات را برآورده کنند:

  1. مطمئن شوید که از شماره تلفن‌هایی استفاده می‌کنید که واقعاً خیالی هستند و ازقبل وجود ندارند. ‫Firebase Authentication به شما اجازه نمی‌دهد شماره تلفن‌های موجود مورداستفاده کاربران واقعی را به‌عنوان شماره‌های آزمایشی تنظیم کنید. یکی از گزینه‌ها استفاده از شماره‌های پیش‌شماره ۵۵۵ به‌عنوان شماره تلفن‌های آزمایشی ایالات متحده است، برای مثال: +1 650-555-3434
  2. شماره تلفن‌ها باید ازنظر طول و دیگر محدودیت‌ها قالب‌بندی صحیح داشته باشند. این شماره‌ها همچنان همان فرایند اعتبارسنجی شماره تلفن کاربر واقعی را طی خواهند کرد.
  3. می‌توانید حداکثر ۱۰ شماره تلفن برای توسعه اضافه کنید.
  4. از شماره تلفن‌ها/کدهای آزمایشی استفاده کنید که حدس زدن آن‌ها دشوار باشد و آن‌ها را مرتباً تغییر دهید.

ایجاد شماره تلفن‌های ساختگی و کدهای درستی‌سنجی

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  2. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم تلفن را فعال کنید اگر قبلاً این کار را نکرده‌اید.
  3. بخش شماره‌های تلفن برای آزمایش را ازهم باز کنید.
  4. شماره تلفنی را که می‌خواهید آزمایش کنید ارائه دهید، برای مثال: +1 650-555-3434.
  5. کد درستی‌سنجی ۶ رقمی را برای آن شماره خاص ارائه دهید، برای مثال: 654321.
  6. برای هر شماره، روی افزودن کلیک کنید. درصورت نیاز، می‌توانید شماره تلفن و کد آن را با نگه داشتن نشانگر روی ردیف مربوطه و کلیک کردن روی نماد سطل زباله حذف کنید.

آزمایش دستی

می‌توانید مستقیماً از شماره تلفن ساختگی در برنامه‌تان استفاده کنید. این کار به شما امکان می‌دهد در مراحل توسعه، آزمایش دستی انجام دهید بدون اینکه با مشکلات سهمیه یا محدودسازی مواجه شوید. همچنین می‌توانید مستقیماً از شبیه‌ساز iOS یا شبیه‌ساز Android بدون نصب «خدمات Google Play» آزمایش کنید.

وقتی شماره تلفن ساختگی را ارائه می‌کنید و کد درستی‌سنجی را ارسال می‌کنید، هیچ پیامک واقعی‌ای ارسال نمی‌شود. درعوض، برای تکمیل ورود به سیستم باید کد درستی‌سنجی ازقبل پیکربندی‌شده را ارائه دهید.

پس‌از تکمیل ورود به سیستم، کاربر Firebase با آن شماره تلفن ایجاد می‌شود. کاربر همان رفتار و ویژگی‌های کاربر شماره تلفن واقعی را دارد و می‌تواند به Realtime Database/Cloud Firestore و سرویس‌های دیگر به همان روش دسترسی داشته باشد. کد شناسه‌ای که درطول این فرایند تولید می‌شود همان امضای کاربر شماره تلفن واقعی را دارد.

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

برای راه‌اندازی دستی جریان reCAPTCHA برای آزمایش، از روش forceRecaptchaFlowForTesting() استفاده کنید.

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

آزمایش یکپارچه‌سازی

علاوه‌بر آزمایش دستی، Firebase Authentication «میاناهای برنامه‌سازی کاربردی» را برای کمک به نوشتن آزمایش‌های یکپارچه‌سازی برای آزمایش اصالت‌سنجی تلفنی ارائه می‌دهد. این «میاناهای برنامه‌سازی کاربردی» با غیرفعال کردن الزام reCAPTCHA در وب و اعلان‌های لحظه‌ای بی‌صدا در iOS، درستی‌سنجی برنامه را غیرفعال می‌کنند. این کار امکان آزمایش خودکارسازی را در این جریان‌ها فراهم می‌کند و پیاده‌سازی آن را آسان‌تر می‌کند. علاوه‌براین، آن‌ها به ارائه قابلیت آزمایش کردن جریان‌های درستی‌سنجی فوری در Android کمک می‌کنند.

در Android، قبل‌از تماس signInWithPhoneNumber با setAppVerificationDisabledForTesting() تماس بگیرید. این کار درستی‌سنجی برنامه را به‌طور خودکار غیرفعال می‌کند و به شما امکان می‌دهد بدون حل کردن دستی، شماره تلفن را وارد کنید. حتی اگر «تمامیت Play» و reCAPTCHA غیرفعال باشند، استفاده از شماره تلفن واقعی همچنان باعث تکمیل نشدن ورود به سیستم می‌شود. فقط شماره تلفن‌های ساختگی را می‌توان با این API استفاده کرد.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

تماس با verifyPhoneNumber با شماره‌ای ساختگی باعث راه‌اندازی onCodeSent تماس برگشتی می‌شود که در آن باید کد درستی‌سنجی مربوطه را ارائه دهید. این کار امکان آزمایش در «شبیه‌سازهای Android» را فراهم می‌کند.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

علاوه‌براین، می‌توانید با تنظیم شماره ساختگی و کد درستی‌سنجی مربوط به آن برای بازیابی خودکار با تماس با setAutoRetrievedSmsCodeForPhoneNumber، جریان‌های بازیابی خودکار را در Android آزمایش کنید.

وقتی verifyPhoneNumber فراخوانده می‌شود، onVerificationCompleted را با PhoneAuthCredential مستقیماً راه‌اندازی می‌کند. این قابلیت فقط با شماره تلفن‌های ساختگی کار می‌کند.

هنگام انتشار برنامه‌تان در فروشگاه Google Play، مطمئن شوید که این ویژگی غیرفعال باشد و هیچ شماره تلفن ساختگی در برنامه شما کدبندی سخت نشده باشد.

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

مراحل بعدی

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

  • در برنامه‌هایتان، می‌توانید اطلاعات نمایه پایه کاربر را از FirebaseUser شیء دریافت کنید. مدیریت کاربران را ببینید.

  • در Firebase Realtime Database و Cloud Storage قوانین امنیتی، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائه‌دهنده اصالت‌سنجی به حساب کاربری موجود بااستفاده از چندین ارائه‌دهنده اصالت‌سنجی به سیستم برنامه‌تان وارد شوند.

برای خروج از سیستم کاربر، signOut را فراخوانی کنید:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();