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

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

ساده ترین راه برای افزودن ورود به سیستم با شماره تلفن به برنامه خود استفاده از FirebaseUI است که شامل یک ویجت ورود به سیستم است که جریان های ورود به سیستم را برای ورود به شماره تلفن و همچنین ورود مبتنی بر رمز عبور و ورود به سیستم را اجرا می کند. -در این سند نحوه پیاده‌سازی جریان ورود به سیستم شماره تلفن را با استفاده از Firebase SDK توضیح می‌دهد.

قبل از شروع

  1. اگر قبلاً این کار را نکرده‌اید، Firebase را به پروژه Android خود اضافه کنید .
  2. در فایل Gradle ماژول (سطح برنامه) خود (معمولا <project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle )، وابستگی را برای Firebase Authentication اضافه کنید. کتابخانه برای اندروید توصیه می‌کنیم از Firebase Android BoM برای کنترل نسخه‌سازی کتابخانه استفاده کنید.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.4.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:23.0.0")
    }
    به دنبال یک ماژول کتابخانه خاص کاتلین هستید؟ از اکتبر 2023 ( Firebase BoM 32.5.0) ، توسعه دهندگان Kotlin و Java می توانند به ماژول کتابخانه اصلی وابسته باشند (برای جزئیات، به سؤالات متداول در مورد این ابتکار مراجعه کنید).
  3. اگر هنوز برنامه خود را به پروژه Firebase متصل نکرده اید، این کار را از کنسول Firebase انجام دهید.
  4. اگر قبلاً هش SHA-1 برنامه خود را در کنسول Firebase تنظیم نکرده‌اید، این کار را انجام دهید. برای اطلاعات در مورد یافتن هش SHA-1 برنامه خود به تأیید اعتبار مشتری خود مراجعه کنید.

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

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

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

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

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

  1. در کنسول Firebase ، بخش Authentication را باز کنید.
  2. در صفحه Sign-in Method ، روش ورود شماره تلفن را فعال کنید.

تأیید برنامه را فعال کنید

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

  • Play Integrity API : اگر کاربر دستگاهی با Google Play services نصب کرده باشد و Firebase Authentication بتواند با استفاده از Play Integrity API قانونی بودن دستگاه را تأیید کند، ورود به شماره تلفن می‌تواند ادامه یابد. Play Integrity API در یک پروژه متعلق به Google توسط Firebase Authentication فعال شده است، نه در پروژه شما. این به هیچ سهمیه Play Integrity API در پروژه شما کمک نمی کند. پشتیبانی Play Integrity با Authentication SDK v21.2.0+ ( Firebase BoM v31.4.0+) در دسترس است.

    برای استفاده از Play Integrity، اگر هنوز اثر انگشت SHA-256 برنامه خود را مشخص نکرده‌اید، این کار را از تنظیمات پروژه کنسول Firebase انجام دهید. برای جزئیات در مورد نحوه دریافت اثر انگشت SHA-256 برنامه خود، به تأیید اعتبار مشتری خود مراجعه کنید.

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

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

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

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

می‌توانید با forceRecaptchaFlowForTesting جریان تأیید reCAPTCHA setAppVerificationDisabledForTesting مجبور کنید.

عیب یابی

  • هنگام استفاده از reCAPTCHA برای تأیید برنامه، خطای "حالت اولیه از دست رفته".

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

یک کد تأیید را به تلفن کاربر ارسال کنید

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

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

Kotlin+KTX

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 Activity خود ذخیره کنید و پرچم را در onRestoreInstanceState بازیابی کنید. در نهایت، در روش onStart Activity خود، بررسی کنید که آیا تأیید از قبل در حال انجام است یا خیر، و اگر چنین است، دوباره با verifyPhoneNumber تماس بگیرید. هنگامی که تأیید کامل شد یا ناموفق بود، حتماً پرچم را پاک کنید (به تماس‌های تأیید صحت مراجعه کنید).

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

پیام اس ام اس ارسال شده توسط Firebase همچنین می تواند با تعیین زبان تأیید از طریق متد setLanguageCode در نمونه Auth شما، بومی سازی شود.

Kotlin+KTX

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+KTX

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 استفاده می کند که شامل یک هش 11 کاراکتری در انتهای پیام SMS است.
در هر صورت، شماره تلفن کاربر با موفقیت تأیید شده است، و می‌توانید از شی PhoneAuthCredential که به callback ارسال می‌شود برای ورود به کاربر استفاده کنید.

onVerificationFailed(FirebaseException)

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

onCodeSent (شناسه تأیید رشته، PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrievalTimeOut (شناسه تأیید رشته)

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

برخی از برنامه‌ها ورودی کاربر را تا زمانی که دوره تأیید خودکار به پایان برسد مسدود می‌کنند و تنها پس از آن رابط کاربری نمایش داده می‌شود که از کاربر می‌خواهد کد تأیید را از پیام SMS تایپ کند (توصیه نمی‌شود).

یک شی PhoneAuthCredential ایجاد کنید

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

برای ایجاد شیء PhoneAuthCredential ، PhoneAuthProvider.getCredential را فراخوانی کنید:

Kotlin+KTX

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

Java

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

کاربر را وارد کنید

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

Kotlin+KTX

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 تنظیم کنید. آزمایش با شماره تلفن های خیالی این مزایا را به همراه دارد:

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

شماره تلفن های خیالی باید این شرایط را داشته باشند:

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

شماره تلفن های خیالی و کدهای تأیید را ایجاد کنید

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

تست دستی

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

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

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

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

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

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

تست یکپارچه سازی

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

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

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

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

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+KTX

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+KTX

// 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+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();