احراز هویت تلفن

احراز هویت تلفن به کاربران اجازه می دهد تا با استفاده از تلفن خود به عنوان احراز هویت وارد Firebase شوند. یک پیام کوتاه (با استفاده از شماره تلفن ارائه شده) حاوی یک کد منحصر به فرد برای کاربر ارسال می شود. پس از تأیید کد، کاربر می‌تواند وارد Firebase شود.

شماره‌های تلفنی که کاربران نهایی برای احراز هویت ارائه می‌کنند توسط Google ارسال و ذخیره می‌شود تا پیشگیری از هرزنامه و سوء استفاده در سراسر سرویس Google، از جمله به Firebase، اما نه محدود به آن، بهبود یابد. برنامه‌نویسان باید قبل از استفاده از سرویس ورود به سیستم شماره تلفن Firebase Authentication از رضایت کاربر نهایی مناسب اطمینان حاصل کنند. authentication

احراز هویت تلفن Firebase در همه کشورها پشتیبانی نمی شود. لطفا سوالات متداول آنها را برای اطلاعات بیشتر ببینید.

راه اندازی

قبل از شروع با احراز هویت تلفن، مطمئن شوید که این مراحل را دنبال کرده اید:

  1. تلفن را به عنوان روش ورود به سیستم در کنسول Firebase فعال کنید.
  2. Android : اگر قبلاً هش SHA-1 برنامه خود را در کنسول Firebase تنظیم نکرده‌اید، این کار را انجام دهید. برای اطلاعات در مورد یافتن هش SHA-1 برنامه خود به تأیید اعتبار مشتری خود مراجعه کنید.
  3. iOS : در Xcode، اعلان‌های فشاری را برای پروژه خود فعال کنید و مطمئن شوید که کلید احراز هویت APN‌ها با Firebase Cloud Messaging (FCM) پیکربندی شده است. علاوه بر این، باید حالت‌های پس‌زمینه را برای اعلان‌های راه دور فعال کنید . برای مشاهده توضیح عمیق این مرحله، مستندات Firebase iOS Phone Auth را مشاهده کنید.
  4. وب : اطمینان حاصل کنید که دامنه برنامه های خود را در کنسول Firebase ، تحت دامنه های تغییر مسیر OAuth اضافه کرده اید.

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

استفاده

Firebase Authentication SDK for Flutter دو روش جداگانه برای ورود کاربر با شماره تلفن خود ارائه می دهد. پلتفرم‌های بومی (مانند Android و iOS) عملکردهای متفاوتی را برای اعتبارسنجی شماره تلفن نسبت به وب ارائه می‌دهند، بنابراین دو روش منحصرا برای هر پلتفرم وجود دارد:

  • پلتفرم بومی : verifyPhoneNumber .
  • بستر وب : signInWithPhoneNumber .

بومی: verifyPhoneNumber

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

ابتدا باید از کاربر شماره تلفن خود را بخواهید. پس از ارائه، متد verifyPhoneNumber() فراخوانی کنید:

await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);

4 تماس جداگانه وجود دارد که باید آنها را مدیریت کنید، که هر کدام نحوه به روز رسانی رابط کاربری برنامه را تعیین می کند:

  1. verificationCompleted : مدیریت خودکار کد پیامک در دستگاه‌های Android.
  2. verificationFailed : رویدادهای خرابی مانند شماره تلفن نامعتبر یا اینکه آیا از سهمیه پیامک فراتر رفته است را مدیریت کنید.
  3. codeSent : زمانی که کدی از Firebase به دستگاه ارسال شده است که برای درخواست از کاربران برای وارد کردن کد استفاده می شود، رسیدگی می کند.
  4. codeAutoRetrievalTimeout : زمانی که مدیریت خودکار کد پیامک با شکست مواجه می شود، مهلت زمانی را مدیریت کنید.

تأیید تکمیل شد

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

هنگامی که کد پیامک به دستگاه تحویل داده می شود، Android به طور خودکار کد پیامک را بدون نیاز به وارد کردن دستی کد توسط کاربر تأیید می کند. اگر این رویداد رخ دهد، یک PhoneAuthCredential به طور خودکار ارائه می شود که می تواند برای ورود به سیستم یا پیوند دادن شماره تلفن کاربر استفاده شود.

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!

    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);

تأیید انجام نشد

اگر Firebase خطایی را برگرداند، به عنوان مثال برای شماره تلفن نادرست یا اگر از سهمیه پیامک پروژه بیشتر شده باشد، FirebaseAuthException به این کنترل کننده ارسال می شود. در این حالت، بسته به کد خطا، از کاربر خود می‌خواهید مشکلی پیش بیاید.

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }

    // Handle other errors
  },
);

کد ارسال شده

هنگامی که Firebase یک کد SMS به دستگاه ارسال می‌کند، این کنترلر با یک verificationId و resendToken فعال می‌شود (یک resendToken فقط در دستگاه‌های Android پشتیبانی می‌شود، دستگاه‌های iOS همیشه یک مقدار null را برمی‌گردانند).

پس از راه‌اندازی، زمان خوبی برای به‌روزرسانی رابط کاربری برنامه‌تان خواهد بود تا از کاربر بخواهد کد SMS مورد انتظار خود را وارد کند. پس از وارد کردن کد پیامک، می‌توانید شناسه تأیید را با کد پیامک ترکیب کنید تا یک PhoneAuthCredential جدید ایجاد کنید:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';

    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);

    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);

به طور پیش فرض، Firebase اگر پیام کوتاه جدید ارسال شده باشد، مجدداً ارسال نمی کند. با این حال، می‌توانید با فراخوانی مجدد متد verifyPhoneNumber با نشانه ارسال مجدد به آرگومان forceResendingToken ، این رفتار را لغو کنید. در صورت موفقیت آمیز بودن، پیامک مجددا ارسال خواهد شد.

codeAutoRetrievalTimeout

در دستگاه‌های اندرویدی که از وضوح کد پیامک خودکار پشتیبانی می‌کنند، اگر دستگاه به‌طور خودکار یک پیام کوتاه را در بازه زمانی مشخصی حل و فصل نکرده باشد، این کنترل‌کننده فراخوانی می‌شود. پس از سپری شدن بازه زمانی، دستگاه دیگر تلاشی برای حل و فصل پیام های دریافتی نخواهد کرد.

به طور پیش‌فرض، دستگاه 30 ثانیه منتظر می‌ماند، اما می‌توان آن را با آرگومان timeout سفارشی کرد:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);

وب: signInWithPhoneNumber

در پلتفرم‌های وب، کاربران می‌توانند با تأیید دسترسی به تلفن با وارد کردن کد پیامک ارسال شده به شماره تلفن ارائه‌شده، وارد سیستم شوند. برای امنیت بیشتر و جلوگیری از هرزنامه، از کاربران درخواست می شود با تکمیل ویجت Google reCAPTCHA ثابت کنند که انسان هستند. پس از تایید، کد پیامک ارسال خواهد شد.

Firebase Authentication SDK for Flutter ویجت reCAPTCHA را به صورت پیش‌فرض مدیریت می‌کند، اما کنترل نحوه نمایش و پیکربندی آن را در صورت لزوم فراهم می‌کند. برای شروع، با شماره تلفن با روش signInWithPhoneNumber تماس بگیرید.

FirebaseAuth auth = FirebaseAuth.instance;

// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');

با فراخوانی روش ابتدا ویجت reCAPTCHA نمایش داده می شود. کاربر باید قبل از ارسال کد پیامکی تست را تکمیل کند. پس از تکمیل، می‌توانید با ارائه کد پیامک به روش confirm در پاسخ ConfirmationResult ، کاربر را وارد کنید:

UserCredential userCredential = await confirmationResult.confirm('123456');

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

پیکربندی reCAPTCHA

ویجت reCAPTCHA یک جریان کاملاً مدیریت شده است که امنیت برنامه وب شما را فراهم می کند.

آرگومان دوم signInWithPhoneNumber یک نمونه اختیاری RecaptchaVerifier را می پذیرد که می تواند برای مدیریت ویجت استفاده شود. به‌طور پیش‌فرض، وقتی جریان ورود به سیستم فعال می‌شود، ویجت به‌عنوان یک ویجت نامرئی نمایش داده می‌شود. یک ویجت "نامرئی" به عنوان یک مدال تمام صفحه در بالای برنامه شما ظاهر می شود.

با این حال، امکان نمایش یک ویجت درون خطی وجود دارد که کاربر باید صریحاً آن را فشار دهد تا خود را تأیید کند.

برای افزودن یک ویجت درون خطی، شناسه عنصر DOM را به آرگومان container نمونه RecaptchaVerifier مشخص کنید. عنصر باید وجود داشته باشد و خالی باشد در غیر این صورت خطایی ایجاد می شود. اگر هیچ آرگومان container ارائه نشود، ویجت به عنوان "نامرئی" نمایش داده می شود.

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

همانطور که در بالا نشان داده شده است می توانید به صورت اختیاری اندازه و موضوع را با سفارشی کردن آرگومان های size و theme تغییر دهید.

همچنین می توان به رویدادهایی گوش داد، مانند اینکه آیا reCAPTCHA توسط کاربر تکمیل شده است، آیا reCAPTCHA منقضی شده است یا خطایی رخ داده است:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

تست کردن

Firebase از تست محلی شماره تلفن ها پشتیبانی می کند:

  1. در کنسول Firebase، ارائه‌دهنده احراز هویت «تلفن» را انتخاب کنید و روی منوی کشویی «شماره‌های تلفن برای آزمایش» کلیک کنید.
  2. یک شماره تلفن جدید (به عنوان مثال +44 7444 555666 ) و یک کد آزمایشی (مثلاً 123456 ) وارد کنید.

در صورت ارائه یک شماره تلفن آزمایشی به روش‌های verifyPhoneNumber یا signInWithPhoneNumber ، در واقع هیچ پیامکی ارسال نمی‌شود. در عوض می‌توانید کد آزمایش را مستقیماً به PhoneAuthProvider یا با کنترل‌کننده نتیجه تأیید signInWithPhoneNumber ارائه دهید.