میتوانید از Firebase Authentication برای ورود کاربر با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر با استفاده از کد یکبار مصرف موجود در پیام اس ام اس وارد سیستم می شود.
ساده ترین راه برای افزودن ورود به سیستم با شماره تلفن به برنامه خود استفاده از FirebaseUI است که شامل یک ویجت ورود به سیستم است که جریان های ورود به سیستم را برای ورود به شماره تلفن و همچنین ورود مبتنی بر رمز عبور و ورود به سیستم را اجرا می کند. -در این سند نحوه پیادهسازی جریان ورود به سیستم شماره تلفن را با استفاده از Firebase SDK توضیح میدهد.
قبل از شروع
- اگر قبلاً این کار را نکردهاید، Firebase را به پروژه Android خود اضافه کنید .
- در فایل 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.3.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 استفاده میکند.
به دنبال یک ماژول کتابخانه خاص کاتلین هستید؟ از اکتبر 2023 ( Firebase BoM 32.5.0) ، توسعه دهندگان Kotlin و Java می توانند به ماژول کتابخانه اصلی وابسته باشند (برای جزئیات، به سؤالات متداول در مورد این ابتکار مراجعه کنید).(جایگزین) وابستگی های کتابخانه 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") }
- اگر هنوز برنامه خود را به پروژه Firebase متصل نکرده اید، این کار را از کنسول Firebase انجام دهید.
- اگر قبلاً هش SHA-1 برنامه خود را در کنسول Firebase تنظیم نکردهاید، این کار را انجام دهید. برای اطلاعات در مورد یافتن هش SHA-1 برنامه خود به تأیید اعتبار مشتری خود مراجعه کنید.
نگرانی های امنیتی
احراز هویت تنها با استفاده از یک شماره تلفن، در عین راحتی، امنیت کمتری نسبت به سایر روشهای موجود دارد، زیرا داشتن شماره تلفن به راحتی بین کاربران قابل انتقال است. همچنین، در دستگاههایی با پروفایلهای کاربری متعدد، هر کاربری که میتواند پیامک دریافت کند، میتواند با استفاده از شماره تلفن دستگاه وارد حساب کاربری شود.
اگر از ورود بر اساس شماره تلفن در برنامه خود استفاده میکنید، باید آن را در کنار روشهای ورود امنتر ارائه دهید و کاربران را از معاوضههای امنیتی استفاده از ورود به سیستم با شماره تلفن مطلع کنید.
ورود به سیستم شماره تلفن را برای پروژه Firebase خود فعال کنید
برای ورود کاربران از طریق پیامک، ابتدا باید روش ورود شماره تلفن را برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، بخش Authentication را باز کنید.
- در صفحه 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، تست کنید.
- تستهای یکپارچهسازی را بدون مسدود شدن توسط بررسیهای امنیتی که معمولاً روی شمارههای تلفن واقعی در یک محیط تولید اعمال میشود، بنویسید.
شماره تلفن های خیالی باید این شرایط را داشته باشند:
- مطمئن شوید که از شمارههای تلفنی استفاده میکنید که واقعاً تخیلی هستند و قبلاً وجود ندارند. Firebase Authentication به شما اجازه نمی دهد شماره تلفن های موجود مورد استفاده توسط کاربران واقعی را به عنوان شماره آزمایشی تنظیم کنید. یکی از گزینه ها استفاده از 555 شماره پیشوند به عنوان شماره تلفن آزمایشی ایالات متحده است، به عنوان مثال: +1 650-555-3434
- شماره تلفن ها باید از نظر طول و سایر محدودیت ها به درستی قالب بندی شوند. آنها همچنان از اعتبار سنجی مشابه شماره تلفن یک کاربر واقعی برخوردار خواهند بود.
- می توانید حداکثر 10 شماره تلفن برای توسعه اضافه کنید.
- از شمارهها/کدهای تلفن آزمایشی استفاده کنید که حدس زدن آنها سخت است و مرتباً آنها را تغییر دهید.
شماره تلفن های خیالی و کدهای تأیید را ایجاد کنید
- در کنسول Firebase ، بخش Authentication را باز کنید.
- اگر قبلاً این کار را نکردهاید، در برگه روش ورود به سیستم ، ارائهدهنده تلفن را فعال کنید.
- منوی شماره تلفن برای آزمایش آکاردئون را باز کنید.
- شماره تلفنی را که میخواهید آزمایش کنید وارد کنید، به عنوان مثال: +1 650-555-3434 .
- کد تأیید 6 رقمی آن شماره خاص را وارد کنید، به عنوان مثال: 654321 .
- عدد را اضافه کنید . در صورت نیاز، میتوانید شماره تلفن و کد آن را با نگه داشتن ماوس روی ردیف مربوطه و کلیک کردن روی نماد حذفشده حذف کنید.
تست دستی
می توانید مستقیماً از یک شماره تلفن خیالی در برنامه خود استفاده کنید. این به شما این امکان را میدهد تا تستهای دستی را در طول مراحل توسعه انجام دهید، بدون اینکه درگیر مشکلات سهمیه یا 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();