میتوانید از Firebase Authentication برای ورود به سیستم کاربر با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر بااستفاده از کد یکبارمصرف موجود در پیامک به سیستم وارد میشود.
سادهترین راه برای افزودن ورود به سیستم با شماره تلفن به برنامه، استفاده از FirebaseUI است که شامل ابزارک ورود به سیستم آمادهای است که جریانهای ورود به سیستم را برای ورود به سیستم با شماره تلفن، و همچنین ورود به سیستم فدرال و مبتنی بر گذرواژه پیادهسازی میکند. این سند نحوه پیادهسازی جریان ورود به سیستم با شماره تلفن را بااستفاده از «کیت توسعه نرمافزار Firebase» شرح میدهد.
قبل از شروع
- اگر هنوز برنامهتان را به پروژه Firebase متصل نکردهاید، این کار را از کنسول Firebase انجام دهید.
-
از «مدیر بسته Swift» برای نصب و مدیریت وابستگیهای Firebase استفاده کنید.
- در Xcode، با باز بودن پروژه برنامه، به File > Add Packages (فایل > افزودن بستهها) پیمایش کنید.
- وقتی درخواست شد، مخزن کیت توسعه نرمافزار پلاتفرمهای Firebase Apple را اضافه کنید:
- کتابخانه Firebase Authentication را انتخاب کنید.
- پرچم
-ObjCرا به بخش پرچمهای پیونددهنده دیگر در تنظیمات ساخت هدف اضافه کنید. - پساز اتمام، Xcode بهطور خودکار شروع به حل و بارگیری وابستگیهای شما در پسزمینه میکند.
https://github.com/firebase/firebase-ios-sdk.git
نگرانیهای امنیتی
اصالتسنجی فقط بااستفاده از شماره تلفن، اگرچه راحت است، اما نسبت به روشهای موجود دیگر امنیت کمتری دارد، زیرا مالکیت شماره تلفن بهراحتی میتواند بین کاربران منتقل شود. همچنین در دستگاههایی که چند نمایه کاربر دارند، هر کاربری که بتواند پیامک دریافت کند میتواند بااستفاده از شماره تلفن دستگاه به سیستم حساب وارد شود.
اگر در برنامهتان از ورود به سیستم براساس شماره تلفن استفاده میکنید، باید آن را درکنار روشهای امنتر ورود به سیستم ارائه دهید و کاربران را از معاوضههای امنیتی استفاده از ورود به سیستم با شماره تلفن مطلع کنید.
ورود به سیستم با شماره تلفن را برای پروژه Firebase خود فعال کنید
برای وارد کردن کاربران به سیستم ازطریق پیامک، ابتدا باید روش «ورود به سیستم با شماره تلفن» را برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase، به امنیت > اصالتسنجی بروید.
- در برگه روش ورود به سیستم، ارائهدهنده ورود به سیستم تلفن را فعال کنید.
-
خطمشیای برای مناطقی که میخواهید ارسال پیامک به آنها مجاز یا غیرمجاز باشد تنظیم کنید. تنظیم خطمشی منطقه پیامک میتواند به محافظت از برنامههایتان دربرابر سوءاستفاده از پیامک کمک کند. برای پروژههای جدید، خطمشی پیشفرض هیچ منطقهای را مجاز نمیداند.
- در کنسول Firebase، به امنیت > اصالتسنجی > زبانه تنظیمات بروید.
- در بخش خطمشی منطقه پیامک، خطمشی منطقه پیامک را تنظیم کنید.
فعال کردن درستیسنجی برنامه
برای استفاده از اصالتسنجی شماره تلفن، Firebase باید بتواند درستیسنجی کند که درخواستهای ورود به سیستم با شماره تلفن از برنامه شما میآید. Firebase Authentication این کار را به دو روش انجام میدهد:
- اعلانهای APN بیصدا: وقتی کاربری را برای اولینبار با شماره تلفنش در دستگاهی به سیستم وارد میکنید، Firebase Authentication بااستفاده از اعلان لحظهای بیصدا یک رمز به دستگاه ارسال میکند. اگر برنامه شما
اعلان را از Firebase با موفقیت دریافت کند،
ورود به سیستم با شماره تلفن میتواند ادامه یابد.
برای iOS 8.0 و نسخههای جدیدتر، اعلانهای بیصدا نیازی به رضایت صریح کاربر ندارند و بنابراین، اگر کاربر دریافت اعلانهای APNs را در برنامه رد کند، این اعلانها تحت تأثیر قرار نمیگیرند. بنابراین، برنامه هنگام پیادهسازی اصالتسنجی شماره تلفن Firebase، نیازی به درخواست اجازه کاربر برای دریافت اعلانهای لحظهای ندارد.
- درستیسنجی reCAPTCHA: درصورتیکه ارسال یا دریافت اعلان لحظهای بیصدا امکانپذیر نباشد، مثلاً زمانی که کاربر بازآوری پسزمینه را برای برنامه شما غیرفعال کرده باشد، یا زمانی که برنامه شما در شبیهساز iOS آزمایش میشود، Firebase Authentication از درستیسنجی reCAPTCHA برای تکمیل جریان ورود به سیستم با تلفن استفاده میکند. چالش reCAPTCHA اغلب میتواند بدون نیاز به حل کردن چیزی توسط کاربر تکمیل شود.
وقتی اعلانهای لحظهای بیصدا بهدرستی پیکربندی شده باشند، تنها درصد بسیار کمی از کاربران جریان reCAPTCHA را تجربه خواهند کرد. بااینحال، باید مطمئن شوید که ورود به سیستم با شماره تلفن صرفنظر از اینکه اعلانهای لحظهای بیصدا دردسترس هستند یا نه، بهدرستی کار میکند.
شروع دریافت اعلانهای بیصدا
برای فعال کردن اعلانهای APNs برای استفاده با Firebase Authentication:
- در Xcode، اعلانهای لحظهای را برای پروژهتان فعال کنید.
-
کلید اصالتسنجی APNs را در Firebase بارگذاری کنید. اگر ازقبل کلید اصالتسنجی APNs ندارید، حتماً در مرکز اعضای توسعهدهندگان Apple یکی ایجاد کنید.
-
در کنسول Firebase، به
تنظیمات > کلی بروید. سپس، روی زبانه «پیامرسانی ابری» کلیک کنید. - در کلید اصالتسنجی APNs در بخش پیکربندی برنامه iOS، روی بارگذاری کلیک کنید تا کلید اصالتسنجی توسعه، یا کلید اصالتسنجی تولید، یا هر دو را بارگذاری کنید. حداقل یکی لازم است.
- به مکانی که کلیدتان را ذخیره کردهاید بروید، آن را انتخاب کنید، و روی باز کردن کلیک کنید. شناسه کلید را برای کلید اضافه کنید (در مرکز اعضای توسعهدهندگان Apple دردسترس است) و روی بارگذاری کلیک کنید.
اگر ازقبل گواهینامه APNs دارید، میتوانید گواهینامه را بارگذاری کنید.
-
در کنسول Firebase، به
- در Xcode، قابلیت «حالتهای پسزمینه» را برای پروژهتان فعال کنید، و سپس چارگوشهای حالتهای واکشی پسزمینه و اعلانهای از دور را انتخاب کنید.
راهاندازی درستیسنجی reCAPTCHA
برای فعال کردن «کیت توسعه نرمافزار Firebase» برای استفاده از درستیسنجی reCAPTCHA:
- طرحهای نشانی وب سفارشی را به پروژه Xcode خود اضافه کنید:
- پیکربندی پروژه را باز کنید: روی نام پروژه در نمای درختی سمت راست دوکلیک کنید. برنامهتان را از بخش هدفها انتخاب کنید، سپس برگه اطلاعات را انتخاب کنید و بخش انواع نشانی وب را ازهم باز کنید.
-
روی دکمه + کلیک کنید و «شناسه برنامه کدبندیشده» خود را بهعنوان طرح نشانی وب اضافه کنید.
بقیه فیلدها را خالی بگذارید.
میتوانید «شناسه برنامه کدبندیشده» را در کنسول Firebase پیدا کنید: به
تنظیمات > برگه کلی بروید، سپس به بخش برنامههای شما پیمایش کنید تا جزئیات مربوط به برنامه iOS خود را ببینید.وقتی تکمیل شد، پیکربندی شما باید چیزی شبیه به موارد زیر باشد (اما با مقادیر ویژه برنامه شما):
- اختیاری: اگر میخواهید روشی را که برنامهتان
SFSafariViewControllerرا هنگام نمایش reCAPTCHA به کاربر ارائه میدهد سفارشیسازی کنید، کلاس سفارشیای ایجاد کنید که با پروتکلAuthUIDelegateمطابقت داشته باشد و آن را بهverifyPhoneNumber(_:uiDelegate:completion:)ارسال کنید.
کد درستیسنجی به تلفن کاربر ارسال شود
برای شروع ورود به سیستم با شماره تلفن، واسطی به کاربر ارائه دهید که از او بخواهد شماره تلفنش را ارائه دهد، و سپس با verifyPhoneNumber(_:uiDelegate:completion:) تماس بگیرید و از Firebase بخواهید کد اصالتسنجی را ازطریق پیامک به تلفن کاربر ارسال کند:
-
شماره تلفن کاربر را دریافت کنید.
الزامات قانونی متفاوت است، اما بهعنوان روال مطلوب و برای تعیین انتظارات کاربران، باید به آنها اطلاع دهید که اگر از ورود به سیستم با تلفن استفاده کنند، ممکن است پیامکی برای درستیسنجی دریافت کنند و نرخهای استاندارد اعمال میشود.
- با
verifyPhoneNumber(_:uiDelegate:completion:)تماس بگیر و شماره تلفن کاربر را به آن ارسال کن.را ببینید.Swift
PhoneAuthProvider.provider() .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in if let error = error { self.showMessagePrompt(error.localizedDescription) return } // Sign in using the verificationID and the code sent to the user // ... }
Objective-C
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput UIDelegate:nil completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // Sign in using the verificationID and the code sent to the user // ... }];
روش
verifyPhoneNumberمجددپذیر است: اگر آن را چندین بار فراخوانی کنید، مثلاً در روشonAppearنمای، روشverifyPhoneNumberپیامک دوم را ارسال نخواهد کرد مگر اینکه درخواست اصلی منقضی شده باشد.وقتی
verifyPhoneNumber(_:uiDelegate:completion:)را فراخوانی میکنید، Firebase اعلان لحظهای بیصدایی به برنامه شما ارسال میکند، یا چالش reCAPTCHA برای کاربر صادر میکند. پساز اینکه برنامه شما اعلان را دریافت کرد یا کاربر چالش reCAPTCHA را تکمیل کرد، Firebase پیامکی حاوی کد اصالتسنجی به شماره تلفن مشخصشده ارسال میکند و شناسه درستیسنجی را به تابع تکمیل شما منتقل میکند. برای ورود به سیستم کاربر، به کد درستیسنجی و شناسه درستیسنجی نیاز دارید.با مشخص کردن زبان مجوز ازطریق دارایی
languageCodeدر نمونه Auth میتوان پیامک ارسالشده توسط Firebase را نیز بومیسازی کرد.Swift
// Change language code to french. Auth.auth().languageCode = "fr";
Objective-C
// Change language code to french. [FIRAuth auth].languageCode = @"fr";
-
شناسه درستیسنجی را ذخیره کنید و وقتی برنامه بار میشود آن را بازیابی کنید. با انجام این کار، میتوانید مطمئن شوید که اگر برنامه شما قبلاز اینکه کاربر جریان ورود به سیستم را تکمیل کند بسته شود (برای مثال، هنگام رفتن به برنامه پیامک)، همچنان شناسه درستیسنجی معتبری داشته باشید.
میتوانید شناسه درستیسنجی را به هر روشی که میخواهید ماندگار کنید. یک روش ساده این است که شناسه درستیسنجی را با شیء
NSUserDefaultsذخیره کنید:Swift
UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
Objective-C
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:verificationID forKey:@"authVerificationID"];
سپس میتوانید مقدار ذخیرهشده را بازیابی کنید:
Swift
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
Objective-C
NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
اگر تماس با verifyPhoneNumber(_:uiDelegate:completion:) موفقیتآمیز بود، میتوانید از کاربر بخواهید کد درستیسنجی را که در پیامک دریافت کرده است تایپ کند.
کاربر را با کد درستیسنجی به سیستم وارد کنید
پساز اینکه کاربر کد درستیسنجی را از پیامک به برنامه شما ارائه داد، با ایجاد یک شیء FIRPhoneAuthCredential
از کد درستیسنجی و شناسه درستیسنجی و انتقال آن شیء به signInWithCredential:completion:، کاربر را به سیستم وارد کنید.
- کد درستیسنجی را از کاربر دریافت کنید.
- شیء
FIRPhoneAuthCredentialرا از کد درستیسنجی و شناسه درستیسنجی ایجاد کنید.Swift
let credential = PhoneAuthProvider.provider().credential( withVerificationID: verificationID, verificationCode: verificationCode )
Objective-C
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:userInput];
- کاربر را با شیء
FIRPhoneAuthCredentialبه سیستم وارد کنید:Swift
Auth.auth().signIn(with: credential) { authResult, error in if let error = error { let authError = error as NSError if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue { // The user is a multi-factor user. Second factor challenge is required. let resolver = authError .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver var displayNameString = "" for tmpFactorInfo in resolver.hints { displayNameString += tmpFactorInfo.displayName ?? "" displayNameString += " " } self.showTextInputPrompt( withMessage: "Select factor to sign in\n\(displayNameString)", completionBlock: { userPressedOK, displayName in var selectedHint: PhoneMultiFactorInfo? for tmpFactorInfo in resolver.hints { if displayName == tmpFactorInfo.displayName { selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo } } PhoneAuthProvider.provider() .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil, multiFactorSession: resolver .session) { verificationID, error in if error != nil { print( "Multi factor start sign in failed. Error: \(error.debugDescription)" ) } else { self.showTextInputPrompt( withMessage: "Verification code for \(selectedHint?.displayName ?? "")", completionBlock: { userPressedOK, verificationCode in let credential: PhoneAuthCredential? = PhoneAuthProvider.provider() .credential(withVerificationID: verificationID!, verificationCode: verificationCode!) let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator .assertion(with: credential!) resolver.resolveSignIn(with: assertion!) { authResult, error in if error != nil { print( "Multi factor finanlize sign in failed. Error: \(error.debugDescription)" ) } else { self.navigationController?.popViewController(animated: true) } } } ) } } } ) } else { self.showMessagePrompt(error.localizedDescription) return } // ... return } // User is signed in // ... }
Objective-C
[[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) { FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; NSMutableString *displayNameString = [NSMutableString string]; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { [displayNameString appendString:tmpFactorInfo.displayName]; [displayNameString appendString:@" "]; } [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString] completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) { FIRPhoneMultiFactorInfo* selectedHint; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { if ([displayName isEqualToString:tmpFactorInfo.displayName]) { selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo; } } [FIRPhoneAuthProvider.provider verifyPhoneNumberWithMultiFactorInfo:selectedHint UIDelegate:nil multiFactorSession:resolver.session completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName] completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) { FIRPhoneAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:verificationCode]; FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { NSLog(@"Multi factor finanlize sign in succeeded."); } }]; }]; } }]; }]; } else if (error) { // ... return; } // User successfully signed in. Get user data from the FIRUser object if (authResult == nil) { return; } FIRUser *user = authResult.user; // ... }];
آزمایش با شماره تلفنهای ساختگی
میتوانید بااستفاده از کنسول Firebase، شماره تلفنهای ساختگی برای توسعه تنظیم کنید. آزمایش با شماره تلفنهای ساختگی این مزایا را دارد:
- بدون مصرف سهمیه استفادهتان، اصالتسنجی شماره تلفن را آزمایش کنید.
- اصالتسنجی شماره تلفن را بدون ارسال پیامک واقعی آزمایش کنید.
- بدون اینکه محدود شوید، آزمایشهای متوالی را با شماره تلفن یکسان اجرا کنید. این کار خطر رد شدن درطول فرایند بازبینی «فروشگاه برنامهها» را به حداقل میرساند، زیرا ممکن است بازبین از همان شماره تلفن برای آزمایش استفاده کند.
- بدون هیچ تلاش اضافهای، در محیطهای توسعه آزمایش کنید، مثلاً امکان توسعه در شبیهساز iOS یا شبیهساز Android بدون «خدمات Google Play».
- آزمایشهای یکپارچهسازی را بدون اینکه بررسیهای امنیتی که معمولاً روی شمارههای تلفن واقعی در محیط تولید اعمال میشود مانع شما شود بنویسید.
شمارههای تلفن ساختگی باید این الزامات را برآورده کنند:
- مطمئن شوید که از شماره تلفنهایی استفاده میکنید که واقعاً خیالی هستند و ازقبل وجود ندارند. Firebase Authentication به شما اجازه نمیدهد شماره تلفنهای موجود مورداستفاده کاربران واقعی را بهعنوان شمارههای آزمایشی تنظیم کنید. یکی از گزینهها استفاده از شمارههای پیششماره ۵۵۵ بهعنوان شماره تلفنهای آزمایشی ایالات متحده است، برای مثال: +1 650-555-3434
- شماره تلفنها باید ازنظر طول و دیگر محدودیتها قالببندی صحیح داشته باشند. این شمارهها همچنان همان فرایند اعتبارسنجی شماره تلفن کاربر واقعی را طی خواهند کرد.
- میتوانید حداکثر ۱۰ شماره تلفن برای توسعه اضافه کنید.
- از شماره تلفنها/کدهای آزمایشی استفاده کنید که حدس زدن آنها دشوار باشد و آنها را مرتباً تغییر دهید.
ایجاد شماره تلفنهای ساختگی و کدهای درستیسنجی
- در کنسول Firebase، به امنیت > اصالتسنجی بروید.
- در برگه روش ورود به سیستم، ارائهدهنده ورود به سیستم تلفن را فعال کنید اگر قبلاً این کار را نکردهاید.
- بخش شمارههای تلفن برای آزمایش را ازهم باز کنید.
-
شماره تلفنی را که میخواهید آزمایش کنید ارائه دهید، برای مثال:
+1 650-555-3434. -
کد درستیسنجی ۶ رقمی را برای آن شماره خاص ارائه دهید، برای مثال:
654321. - برای هر شماره، روی افزودن کلیک کنید. درصورت نیاز، میتوانید شماره تلفن و کد آن را با نگه داشتن نشانگر روی ردیف مربوطه و کلیک کردن روی نماد سطل زباله حذف کنید.
آزمایش دستی
میتوانید مستقیماً از شماره تلفن ساختگی در برنامهتان استفاده کنید. این کار به شما امکان میدهد در مراحل توسعه، آزمایش دستی انجام دهید بدون اینکه با مشکلات سهمیه یا محدودسازی مواجه شوید. همچنین میتوانید مستقیماً از شبیهساز iOS یا شبیهساز Android بدون نصب «خدمات Google Play» آزمایش کنید.
وقتی شماره تلفن ساختگی را ارائه میکنید و کد درستیسنجی را ارسال میکنید، هیچ پیامک واقعیای ارسال نمیشود. درعوض، برای تکمیل ورود به سیستم باید کد درستیسنجی ازقبل پیکربندیشده را ارائه دهید.
پساز تکمیل ورود به سیستم، کاربر Firebase با آن شماره تلفن ایجاد میشود. کاربر همان رفتار و ویژگیهای کاربر شماره تلفن واقعی را دارد و میتواند به Realtime Database/Cloud Firestore و سرویسهای دیگر به همان روش دسترسی داشته باشد. کد شناسهای که درطول این فرایند تولید میشود همان امضای کاربر شماره تلفن واقعی را دارد.
گزینه دیگر این است که برای متمایز کردن این کاربران بهعنوان کاربران جعلی، نقش آزمایشی ازطریق ادعاهای سفارشی تنظیم کنید تا دسترسی را بیشتر محدود کنید.
آزمایش یکپارچهسازی
علاوهبر آزمایش دستی، Firebase Authentication «میاناهای برنامهسازی کاربردی» را برای کمک به نوشتن آزمایشهای یکپارچهسازی برای آزمایش اصالتسنجی تلفنی ارائه میدهد. این «میاناهای برنامهسازی کاربردی» با غیرفعال کردن الزام reCAPTCHA در وب و اعلانهای لحظهای بیصدا در iOS، درستیسنجی برنامه را غیرفعال میکنند. این کار امکان آزمایش خودکارسازی را در این جریانها فراهم میکند و پیادهسازی آن را آسانتر میکند. علاوهبراین، آنها به ارائه قابلیت آزمایش کردن جریانهای درستیسنجی فوری در Android کمک میکنند.
در iOS، تنظیم appVerificationDisabledForTesting باید قبلاز تماس با verifyPhoneNumber روی
TRUE تنظیم شود. این کار بدون نیاز به
هیچ کد APNs یا ارسال اعلانهای لحظهای بیصدا در پسزمینه پردازش میشود و آزمایش کردن در شبیهساز را آسانتر میکند. این کار همچنین جریان بازگشت reCAPTCHA را غیرفعال میکند.
توجه داشته باشید که وقتی درستیسنجی برنامه غیرفعال باشد، استفاده از شماره تلفن غیرساختگی باعث میشود ورود به سیستم تکمیل نشود. فقط شماره تلفنهای ساختگی را میتوان با این API استفاده کرد.
Swift
let phoneNumber = "+16505554567" // This test verification code is specified for the given test phone number in the developer console. let testVerificationCode = "123456" Auth.auth().settings.isAppVerificationDisabledForTesting = true PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) { verificationID, error in if let error = error { // Handles error self.handleError(error) return } let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "", verificationCode: testVerificationCode) Auth.auth().signIn(with: credential) { authResult, error in if let error = error { // Handles error self.handleError(error) return } _user = authResult.user }; };
Objective-C
NSString *phoneNumber = @"+16505554567"; // This test verification code is specified for the given test phone number in the developer console. NSString *testVerificationCode = @"123456"; [FIRAuth auth].settings.appVerificationDisabledForTesting = YES; [[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber completion:^(NSString *_Nullable verificationID, NSError *_Nullable error) { if (error) { // Handles error [self handleError:error]; return; } FIRAuthCredential *credential = [FIRPhoneAuthProvider credentialWithVerificationID:verificationID verificationCode:testVerificationCode]; [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { if (error) { // Handles error [self handleError:error]; return; } _user = user; }]; }];
پیوست: استفاده از ورود به سیستم با تلفن بدون تغییر
Firebase Authentication از روش swizzling برای دریافت خودکار نشان APNs برنامه شما، برای مدیریت اعلانهای لحظهای بیصدایی که Firebase به برنامه شما ارسال میکند، و برای رهگیری خودکار هدایت طرح سفارشی از صفحه درستیسنجی reCAPTCHA درطول درستیسنجی استفاده میکند.
اگر ترجیح میدهید از swizzling استفاده نکنید، میتوانید آن را با افزودن پرچم
FirebaseAppDelegateProxyEnabled به فایل Info.plist برنامهتان و
تنظیم آن روی NO غیرفعال کنید. توجه داشته باشید که تنظیم این پرچم روی NO
همچنین باعث غیرفعال شدن تغییر ترتیب بایتها برای دیگر محصولات Firebase، ازجمله
Firebase Cloud Messaging میشود.
اگر «جایگزینی» را غیرفعال کنید، باید بهطور صریح نشان دستگاه APNs، اعلانهای لحظهای، و نشانی وب هدایت طرح سفارشی را به Firebase Authentication ارسال کنید.
اگر درحال ساختن برنامه SwiftUI هستید، باید بهطور صریح نشان دستگاه APNs، اعلانهای لحظهای، و نشانی وب هدایت طرح سفارشی را به Firebase Authentication ارسال کنید.
برای دریافت کد دستگاه APNs، روش
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
را پیادهسازی کنید و در آن، کد دستگاه را به روش
setAPNSToken(_:type:)
Auth منتقل کنید.
Swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Pass device token to auth Auth.auth().setAPNSToken(deviceToken, type: .unknown) // Further handling of the device token if needed by the app // ... }
Objective-C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Pass device token to auth. [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd]; // Further handling of the device token if needed by the app. }
برای مدیریت اعلانهای لحظهای، در
application(_:didReceiveRemoteNotification:fetchCompletionHandler:):
متد، اعلانهای مربوط به احراز هویت Firebase را با فراخوانی متد canHandleNotification(_:) در Auth بررسی کنید.
Swift
func application(_ application: UIApplication, didReceiveRemoteNotification notification: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { if Auth.auth().canHandleNotification(notification) { completionHandler(.noData) return } // This notification is not auth related; it should be handled separately. }
Objective-C
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // Pass notification to auth and check if they can handle it. if ([[FIRAuth auth] canHandleNotification:notification]) { completionHandler(UIBackgroundFetchResultNoData); return; } // This notification is not auth related; it should be handled separately. }
برای مدیریت نشانی وب هدایتگر طرحواره سفارشی،
application(_:open:options:) را پیادهسازی کنید و در آن، نشانی وب را به روش canHandleURL(_:) در Auth منتقل کنید.
Swift
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { if Auth.auth().canHandle(url) { return true } // URL not auth related; it should be handled separately. }
Objective-C
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[FIRAuth auth] canHandleURL:url]) { return YES; } // URL not auth related; it should be handled separately. }
اگر از SwiftUI یا UISceneDelegate استفاده میکنید، برای مدیریت نشانی وب هدایتگر، روش
scene(_:openURLContexts:) را پیادهسازی کنید و در آنها، نشانی وب را به روش canHandleURL(_:) در Auth منتقل کنید.
Swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { for urlContext in URLContexts { let url = urlContext.url _ = Auth.auth().canHandle(url) } // URL not auth related; it should be handled separately. }
Objective-C
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *urlContext in URLContexts) { [FIRAuth.auth canHandleURL:urlContext.url]; // URL not auth related; it should be handled separately. } }
مراحل بعدی
پساز اینکه کاربر برای اولینبار به سیستم وارد شد، حساب کاربری جدیدی ایجاد میشود و به اطلاعات اعتباری—یعنی نام کاربری و گذرواژه، شماره تلفن، یا اطلاعات ارائهدهنده اصالتسنجی—که کاربر با آن به سیستم وارد شده است پیوند داده میشود. این حساب جدید بهعنوان بخشی از پروژه Firebase شما ذخیره میشود و میتوان از آن برای شناسایی کاربر در همه برنامههای پروژه شما، صرفنظر از نحوه ورود کاربر به سیستم، استفاده کرد.
-
در برنامههایتان، میتوانید اطلاعات نمایه پایه کاربر را از
Userشیء دریافت کنید. به مدیریت کاربران مراجعه کنید. در Firebase Realtime Database و Cloud Storage قوانین امنیتی، میتوانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر
authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد استفاده کنید.
میتوانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائهدهنده اصالتسنجی به حساب کاربری موجود بااستفاده از چندین ارائهدهنده اصالتسنجی به سیستم برنامهتان وارد شوند.
برای خارج کردن کاربر از سیستم،
signOut: را فراخوانی کنید.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
همچنین ممکن است بخواهید کد مدیریت خطا را برای طیف کامل خطاهای اصالتسنجی اضافه کنید. مدیریت خطاها را ببینید.