شما میتوانید Firebase Authentication برای ورود کاربر با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر با استفاده از کد یکبار مصرفی که در پیامک وجود دارد، وارد سیستم میشود.
سادهترین راه برای افزودن ورود با شماره تلفن به برنامهتان، استفاده از FirebaseUI است که شامل یک ویجت ورود به سیستم کشویی است که جریانهای ورود به سیستم را برای ورود با شماره تلفن و همچنین ورود مبتنی بر رمز عبور و ورود فدرال پیادهسازی میکند. این سند نحوه پیادهسازی جریان ورود به سیستم با شماره تلفن را با استفاده از Firebase SDK شرح میدهد.
قبل از اینکه شروع کنی
- اگر هنوز Firebase را به پروژه اندروید خود اضافه نکردهاید، آن را اضافه کنید.
- در فایل 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")) // 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") }
- اگر هنوز برنامه خود را به پروژه Firebase خود متصل نکردهاید، این کار را از کنسول Firebase انجام دهید.
- اگر هنوز هش SHA-1 برنامه خود را در کنسول Firebase تنظیم نکردهاید، این کار را انجام دهید. برای اطلاعات بیشتر در مورد یافتن هش SHA-1 برنامه خود، به بخش «احراز هویت کلاینت» مراجعه کنید.
نگرانیهای امنیتی
احراز هویت تنها با استفاده از شماره تلفن، اگرچه راحت است، اما نسبت به سایر روشهای موجود از امنیت کمتری برخوردار است، زیرا داشتن شماره تلفن میتواند به راحتی بین کاربران منتقل شود. همچنین، در دستگاههایی با چندین پروفایل کاربری، هر کاربری که میتواند پیامک دریافت کند، میتواند با استفاده از شماره تلفن دستگاه وارد یک حساب کاربری شود.
اگر در برنامه خود از ورود به سیستم مبتنی بر شماره تلفن استفاده میکنید، باید آن را در کنار روشهای ورود امنتر ارائه دهید و کاربران را از مزایای امنیتی استفاده از ورود به سیستم با شماره تلفن مطلع کنید.
ورود با شماره تلفن را برای پروژه Firebase خود فعال کنید
برای ورود کاربران از طریق پیامک، ابتدا باید روش ورود با شماره تلفن را برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
- در صفحه روش ورود ، روش ورود با شماره تلفن را فعال کنید.
- اختیاری : در صفحه تنظیمات ، سیاستی را برای مناطقی که میخواهید پیامکها به آنها ارسال شود یا نشود، تنظیم کنید. تنظیم سیاست منطقهای پیامک میتواند به محافظت از برنامههای شما در برابر سوءاستفاده از پیامک کمک کند.
فعال کردن تأیید برنامه
برای استفاده از احراز هویت با شماره تلفن، فایربیس باید بتواند تأیید کند که درخواستهای ورود با شماره تلفن از برنامه شما میآیند. 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پر میشود.
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، تست کنید.
- تستهای یکپارچهسازی را بدون مسدود شدن توسط بررسیهای امنیتی که معمولاً روی شماره تلفنهای واقعی در یک محیط عملیاتی اعمال میشوند، بنویسید.
شماره تلفنهای فرضی باید این شرایط را داشته باشند:
- مطمئن شوید که از شماره تلفنهایی استفاده میکنید که واقعاً خیالی هستند و از قبل وجود ندارند. Firebase Authentication به شما اجازه نمیدهد شماره تلفنهای موجود که توسط کاربران واقعی استفاده میشوند را به عنوان شماره تلفن آزمایشی تنظیم کنید. یک گزینه این است که از شمارههای پیشوند ۵۵۵ به عنوان شماره تلفن آزمایشی ایالات متحده استفاده کنید، به عنوان مثال: +1 650-555-3434
- شماره تلفنها باید از نظر طول و سایر محدودیتها به درستی قالببندی شوند. آنها همچنان از همان اعتبارسنجی شماره تلفن کاربر واقعی عبور خواهند کرد.
- شما میتوانید تا ۱۰ شماره تلفن برای توسعه اضافه کنید.
- از شماره تلفنها/کدهای آزمایشی که حدس زدنشان دشوار است استفاده کنید و مرتباً آنها را تغییر دهید.
شماره تلفنها و کدهای تأیید فرضی ایجاد کنید
- در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
- در برگه «روش ورود» ، اگر قبلاً ارائهدهنده تلفن را فعال نکردهاید، آن را فعال کنید.
- منوی آکاردئونی شماره تلفنها برای آزمایش را باز کنید.
- شماره تلفنی که میخواهید تست کنید را وارد کنید، برای مثال: +1 650-555-3434 .
- کد تأیید ۶ رقمی را برای آن شماره خاص وارد کنید، مثلاً: ۶۵۴۳۲۱ .
- شماره را اضافه کنید . در صورت نیاز، میتوانید شماره تلفن و کد آن را با نگه داشتن ماوس روی ردیف مربوطه و کلیک روی نماد سطل زباله حذف کنید.
تست دستی
شما میتوانید مستقیماً از یک شماره تلفن فرضی در برنامه خود استفاده کنید. این به شما امکان میدهد در طول مراحل توسعه، بدون مواجهه با مشکلات سهمیهبندی یا محدودیت سرعت، تست دستی انجام دهید. همچنین میتوانید مستقیماً از یک شبیهساز 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();