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

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

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

قبل از اینکه شروع کنی

  1. اگر هنوز Firebase را به پروژه اندروید خود اضافه نکرده‌اید، آن را اضافه کنید.
  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:34.9.0&quot;))
    
        // 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 استفاده خواهد کرد.

    (جایگزین) اضافه کردن وابستگی‌های کتابخانه 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:24.0.1")
    }
  3. اگر هنوز برنامه خود را به پروژه Firebase خود متصل نکرده‌اید، این کار را از کنسول Firebase انجام دهید.
  4. اگر هنوز هش SHA-1 برنامه خود را در کنسول Firebase تنظیم نکرده‌اید، این کار را انجام دهید. برای اطلاعات بیشتر در مورد یافتن هش SHA-1 برنامه خود، به بخش «احراز هویت کلاینت» مراجعه کنید.

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

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

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

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

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

  1. در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
  2. در صفحه روش ورود ، روش ورود با شماره تلفن را فعال کنید.
  3. اختیاری : در صفحه تنظیمات ، سیاستی را برای مناطقی که می‌خواهید پیامک‌ها به آنها ارسال شود یا نشود، تنظیم کنید. تنظیم سیاست منطقه‌ای پیامک می‌تواند به محافظت از برنامه‌های شما در برابر سوءاستفاده از پیامک کمک کند.

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

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

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

    برای استفاده از 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 نسخه ۲۱.۲.۰+ ) توزیع نشده باشد.
    • اگر توکن SafetyNet دریافت شده معتبر نبود (در نسخه‌های Authentication SDK < 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 هدایت می‌شود. در مرورگرهای فایرفاکس، باز کردن لینک‌های برنامه اصلی به طور پیش‌فرض غیرفعال است. اگر خطای بالا را در فایرفاکس مشاهده کردید، مراحل موجود در «تنظیم فایرفاکس برای اندروید برای باز کردن لینک‌ها در برنامه‌های اصلی» را دنبال کنید تا باز کردن لینک‌های برنامه فعال شود.

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

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

سپس، شماره تلفن آنها را به متد 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 یک activity، متد verifyPhoneNumber پیامک دوم را ارسال نمی‌کند، مگر اینکه زمان درخواست اصلی به پایان رسیده باشد.

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

برای مدیریت آسان چرخش صفحه نمایش و سایر موارد راه‌اندازی مجدد Activity، Activity خود را به متد verifyPhoneNumber ارسال کنید. فراخوانی‌های برگشتی (callbacks) هنگام توقف Activity به طور خودکار جدا می‌شوند، بنابراین می‌توانید آزادانه کد انتقال رابط کاربری (UI transition code) را در متدهای فراخوانی برگشتی بنویسید.

پیام SMS ارسال شده توسط Firebase همچنین می‌تواند با مشخص کردن زبان auth از طریق متد 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 را پیاده‌سازی کنید.

تأیید هویت تکمیل شد (اعتبار تلفن تأیید شد)

این متد در دو حالت فراخوانی می‌شود:

  • تأیید فوری: در برخی موارد، شماره تلفن می‌تواند فوراً و بدون نیاز به ارسال یا وارد کردن کد تأیید، تأیید شود.
  • بازیابی خودکار: در برخی دستگاه‌ها، سرویس‌های گوگل پلی می‌توانند به‌طور خودکار پیامک تأیید ورودی را شناسایی کرده و بدون نیاز به اقدام کاربر، تأیید را انجام دهند. (این قابلیت ممکن است در برخی اپراتورها در دسترس نباشد.) این قابلیت از API بازیابی پیامک استفاده می‌کند که شامل یک هش ۱۱ کاراکتری در انتهای پیام پیامکی است.
در هر صورت، شماره تلفن کاربر با موفقیت تأیید شده است و می‌توانید از شیء PhoneAuthCredential که به تابع فراخوانی ارسال شده است، برای ورود کاربر استفاده کنید.

خطای onVerificationFailed(FirebaseException)

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

onCodeSent(رشته verificationId، PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrievalTimeOut(رشته 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 یا شبیه‌ساز اندروید بدون سرویس‌های Google Play، تست کنید.
  • تست‌های یکپارچه‌سازی را بدون مسدود شدن توسط بررسی‌های امنیتی که معمولاً روی شماره تلفن‌های واقعی در یک محیط عملیاتی اعمال می‌شوند، بنویسید.

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

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

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

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

تست دستی

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

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

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

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

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

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

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

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

در اندروید، قبل از فراخوانی 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

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 آزمایش کنید.

وقتی 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 دریافت کنید. به مدیریت کاربران مراجعه کنید.

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

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

برای خروج کاربر، signOut را فراخوانی کنید:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();