Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

شما می‌توانید از Firebase Authentication برای ورود به سیستم استفاده کنید و با ارسال ایمیلی حاوی یک پیوند به او، کاربر می‌تواند روی آن کلیک کند تا وارد شود. در این فرآیند، آدرس ایمیل کاربر نیز تأیید می‌شود.

ورود از طریق ایمیل مزایای زیادی دارد:

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

قبل از اینکه شروع کنی

  1. اگر قبلاً این کار را نکرده اید، مراحل راهنمای شروع کار را دنبال کنید.

  2. ورود به سیستم Email Link را برای پروژه Firebase خود فعال کنید.

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

    1. در کنسول Firebase ، بخش Auth را باز کنید.
    2. در برگه روش ورود به سیستم، ارائه دهنده ایمیل/گذرواژه را فعال کنید. توجه داشته باشید که ورود ایمیل/رمز عبور برای استفاده از ورود به سیستم پیوند ایمیل باید فعال باشد.
    3. در همان بخش، روش ورود به سیستم لینک ایمیل (ورود بدون رمز عبور) را فعال کنید.
    4. روی ذخیره کلیک کنید.

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

  1. شی ActionCodeSettings را بسازید، که دستورالعمل‌هایی را در مورد نحوه ساخت پیوند ایمیل به Firebase ارائه می‌دهد. فیلدهای زیر را تنظیم کنید:

    • url : پیوند عمیق برای جاسازی و هر حالت اضافی که باید همراه آن منتقل شود. دامنه پیوند باید در لیست دامنه های مجاز Firebase Console قرار گیرد که با رفتن به برگه روش ورود (Authentication -> Sign-in) می توانید آن را پیدا کنید. اگر برنامه روی دستگاهش نصب نشده باشد و برنامه نصب نشود، پیوند کاربر را به این URL هدایت می‌کند.

    • androidPackageName و IOSBundleId : برنامه‌هایی که هنگام باز شدن پیوند ورود به سیستم در دستگاه Android یا iOS استفاده می‌شوند. درباره نحوه پیکربندی Firebase Dynamic Links برای باز کردن پیوندهای اقدام ایمیل از طریق برنامه های تلفن همراه بیشتر بیاموزید.

    • handleCodeInApp : روی true تنظیم کنید. عملیات ورود به سیستم برخلاف سایر اقدامات ایمیل خارج از باند (بازنشانی رمز عبور و تأیید ایمیل) همیشه باید در برنامه تکمیل شود. این به این دلیل است که در پایان جریان، انتظار می رود کاربر وارد سیستم شود و وضعیت Auth او در برنامه باقی بماند.

    • dynamicLinkDomain : هنگامی که چندین دامنه پیوند پویا سفارشی برای یک پروژه تعریف می شود، مشخص کنید که زمانی که پیوند از طریق یک برنامه تلفن همراه مشخص شده باز می شود از کدام یک استفاده شود (به عنوان مثال، example.page.link ). در غیر این صورت اولین دامنه به طور خودکار انتخاب می شود.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. از کاربر ایمیل خود را بخواهید.

  3. پیوند احراز هویت را به ایمیل کاربر ارسال کنید و در صورتی که کاربر ورود به سیستم ایمیل را در همان دستگاه انجام دهد، ایمیل کاربر را ذخیره کنید.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

نگرانی های امنیتی

برای جلوگیری از استفاده از پیوند ورود به سیستم برای ورود به سیستم به عنوان یک کاربر ناخواسته یا در یک دستگاه ناخواسته، Firebase Auth نیاز دارد که آدرس ایمیل کاربر هنگام تکمیل جریان ورود به سیستم ارائه شود. برای موفقیت در ورود به سیستم، این آدرس ایمیل باید با آدرسی که پیوند ورود به سیستم در ابتدا به آن ارسال شده است مطابقت داشته باشد.

می‌توانید این جریان را برای کاربرانی که پیوند ورود به سیستم را در همان دستگاهی که پیوند را درخواست می‌کنند باز می‌کنند، با ذخیره آدرس ایمیل آنها به صورت محلی - به عنوان مثال با استفاده از SharedPreferences - هنگام ارسال ایمیل ورود به سیستم، ساده کنید. سپس، از این آدرس برای تکمیل جریان استفاده کنید. ایمیل کاربر را در پارامترهای URL تغییر مسیر ندهید و دوباره از آن استفاده کنید زیرا ممکن است تزریق جلسه را فعال کند.

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

همچنین مطمئن شوید که از URL HTTPS در تولید استفاده می کنید تا از رهگیری بالقوه پیوند شما توسط سرورهای واسطه جلوگیری کنید.

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

  1. برنامه خود را برای دریافت پیوندهای پویا در فلاتر در راهنما تنظیم کنید.

  2. در مدیریت پیوند خود، بررسی کنید که آیا پیوند برای احراز هویت پیوند ایمیل است یا خیر و اگر چنین است، فرآیند ورود به سیستم را کامل کنید.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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

تفاوت در نیمه دوم عملیات خواهد بود:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

این همچنین می تواند برای احراز هویت مجدد کاربر پیوند ایمیل قبل از اجرای عملیات حساس استفاده شود.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

با این حال، از آنجایی که جریان ممکن است به دستگاه دیگری ختم شود که کاربر اصلی در آن وارد نشده است، این جریان ممکن است تکمیل نشود. در این صورت می توان خطایی به کاربر نشان داد تا مجبور شود لینک را در همان دستگاه باز کند. برخی از حالت ها را می توان در پیوند ارسال کرد تا اطلاعاتی در مورد نوع عملیات و uid کاربر ارائه شود.

در صورتی که از ورود رمز عبور و پیوند مبتنی بر ایمیل با ایمیل پشتیبانی می کنید، برای متمایز کردن روش ورود به سیستم برای کاربر رمز/پیوند، از fetchSignInMethodsForEmail استفاده کنید. این برای جریان های شناسه اول مفید است که در آن ابتدا از کاربر خواسته می شود ایمیل خود را ارائه کند و سپس روش ورود به سیستم ارائه می شود:

try {
    final signInMethods =
        await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
    final userExists = signInMethods.isNotEmpty;
    final canSignInWithLink = signInMethods
        .contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
    final canSignInWithPassword = signInMethods
        .contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
    switch (exception.code) {
        case "invalid-email":
            print("Not a valid email address.");
            break;
        default:
            print("Unknown error.");
    }
}

همانطور که در بالا توضیح داده شد، ایمیل/گذرواژه و ایمیل/پیوند یک EmailAuthProvider (همان PROVIDER_ID ) با روش‌های مختلف ورود به سیستم در نظر گرفته می‌شوند.

مراحل بعدی

پس از اینکه کاربر یک حساب جدید ایجاد کرد، این حساب به عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در همه برنامه‌های پروژه‌تان استفاده کرد، صرف نظر از اینکه کاربر از چه روش ورود به سیستم استفاده کرده است.

در برنامه های خود، می توانید اطلاعات اولیه نمایه کاربر را از شی User دریافت کنید. به مدیریت کاربران مراجعه کنید.

در قوانین امنیتی Firebase Realtime Database و Cloud Storage، می‌توانید شناسه کاربری منحصربه‌فرد کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید با استفاده از چندین ارائه‌دهنده احراز هویت، با پیوند دادن اعتبار ارائه‌دهنده احراز هویت به یک حساب کاربری موجود، به برنامه شما وارد شوند.

برای خروج از سیستم کاربر، signOut() را فراخوانی کنید:

await FirebaseAuth.instance.signOut();