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

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

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

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

راه‌اندازی

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

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

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

کاربرد

کیت توسعه نرم‌افزاری احراز هویت فایربیس برای فلاتر، دو روش مجزا برای ورود کاربر با شماره تلفن ارائه می‌دهد. پلتفرم‌های بومی (مثلاً اندروید و 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) {},
);

۴ فراخوانی مجدد جداگانه وجود دارد که باید مدیریت کنید، هر کدام نحوه به‌روزرسانی رابط کاربری برنامه را تعیین می‌کنند:

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

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

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

وقتی کد پیامکی به دستگاه ارسال می‌شود، اندروید به طور خودکار کد پیامکی را بدون نیاز به وارد کردن دستی کد توسط کاربر، تأیید می‌کند. در صورت وقوع این رویداد، یک 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 یک کد پیامکی به دستگاه ارسال می‌کند، این هندلر با یک verificationId و resendToken فعال می‌شود ( resendToken فقط در دستگاه‌های اندروید پشتیبانی می‌شود، دستگاه‌های iOS همیشه مقدار null را برمی‌گردانند).

پس از فعال شدن، زمان مناسبی است که رابط کاربری برنامه خود را به‌روزرسانی کنید تا از کاربر بخواهید کد پیامکی مورد انتظار خود را وارد کند. پس از وارد کردن کد پیامکی، می‌توانید شناسه تأیید را با کد پیامکی ترکیب کنید تا یک 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);
  },
);

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

کدبازیابی خودکارزمان انتظار

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

به طور پیش‌فرض، دستگاه 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 ثابت کنند که انسان هستند. پس از تأیید، کد پیامکی ارسال می‌شود.

کیت توسعه نرم‌افزاری احراز هویت فایربیس برای فلاتر، ویجت 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!'),
);

آزمایش

فایربیس از آزمایش شماره تلفن‌ها به صورت محلی پشتیبانی می‌کند:

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

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