بهترین روش‌ها برای استفاده از signInWithRedirect در مرورگرهایی که دسترسی به ذخیره‌سازی شخص ثالث را مسدود می‌کنند

این سند بهترین روش‌ها را برای استفاده از تغییر مسیر در مرورگرهایی که کوکی‌های شخص ثالث را مسدود می‌کنند، توضیح می‌دهد. شما باید یکی از گزینه های فهرست شده در اینجا را دنبال کنید تا signInWithRedirect() تا در محیط های تولیدی در همه مرورگرها عمل کند.

نمای کلی

برای اینکه جریان signInWithRedirect() برای شما و کاربرانتان یکپارچه باشد، Firebase Authentication JavaScript SDK از یک iframe با مبدا متقاطع استفاده می کند که به دامنه میزبانی Firebase برنامه شما متصل می شود. با این حال، این مکانیسم با مرورگرهایی که دسترسی به ذخیره سازی شخص ثالث را مسدود می کنند، کار نمی کند.

از آنجا که درخواست از کاربران خود برای غیرفعال کردن ویژگی های پارتیشن بندی فضای ذخیره سازی در مرورگر به ندرت گزینه ای است، در عوض باید یکی از گزینه های راه اندازی زیر را بسته به ویژگی های مورد استفاده خود در برنامه خود اعمال کنید.

  • اگر برنامه خود را با میزبانی Firebase در زیر دامنه firebaseapp.com میزبانی می کنید، تحت تأثیر این مشکل قرار نگرفته اید و نیازی به اقدامی نیست.
  • اگر برنامه خود را با میزبانی Firebase در یک دامنه سفارشی یا یک زیر دامنه web.app میزبانی می کنید، از گزینه 1 استفاده کنید.
  • اگر برنامه خود را با سرویسی غیر از Firebase میزبانی می کنید، از گزینه 2 ، گزینه 3 ، گزینه 4 یا گزینه 5 استفاده کنید.

گزینه 1: پیکربندی Firebase خود را برای استفاده از دامنه سفارشی خود به عنوان authDomain خود به روز کنید

اگر برنامه خود را با میزبانی Firebase با استفاده از یک دامنه سفارشی میزبانی می کنید، می توانید Firebase SDK را برای استفاده از دامنه سفارشی خود به عنوان authDomain پیکربندی کنید. این تضمین می کند که برنامه شما و iframe auth از یک دامنه استفاده می کنند، که از مشکل ورود به سیستم جلوگیری می کند. (اگر از هاست Firebase استفاده نمی کنید، باید از گزینه دیگری استفاده کنید.). اطمینان حاصل کنید که دامنه سفارشی را روی همان پروژه ای که برای احراز هویت استفاده می کنید راه اندازی کرده اید.

برای به‌روزرسانی پیکربندی Firebase برای استفاده از دامنه سفارشی به عنوان دامنه تأیید، موارد زیر را انجام دهید:

  1. Firebase JS SDK را برای استفاده از دامنه سفارشی خود به عنوان authDomain پیکربندی کنید:

    const firebaseConfig = {
      apiKey: "<api-key>",
      authDomain: "<the-domain-that-serves-your-app>",
      databaseURL: "<database-url>",
      projectId: "<project-id>",
      appId: "<app-id>"
    };
    
  1. authDomain جدید را به لیست URIهای مجاز تغییر مسیر ارائه دهنده OAuth خود اضافه کنید. نحوه انجام این کار به ارائه دهنده بستگی دارد، اما به طور کلی می توانید برای دستورالعمل های دقیق (مثلاً ارائه دهنده فیس بوک ) بخش «قبل از شروع» را در هر ارائه دهنده ای دنبال کنید. URI به‌روزرسانی‌شده برای تأیید به‌نظر می‌رسد https://<the-domain-that-serves-your-app>/__/auth/handler - /__/auth/handler آخر مهم است.

    به طور مشابه، اگر از یک ارائه‌دهنده SAML استفاده می‌کنید، authDomain جدید را به URL SAML Assertion Consumer Service (ACS) اضافه کنید.

  2. مطمئن شوید continue_uri شما در لیست دامنه های مجاز قرار دارد.

  3. در صورت نیاز برای واکشی به روزترین فایل پیکربندی Firebase که در /__/firebase/init.json میزبانی شده است، مجدداً با میزبانی Firebase مستقر شوید.

گزینه 2: به signInWithPopup () بروید

از signInWithPopup() به جای signInWithRedirect() استفاده کنید. بقیه کد برنامه شما یکسان باقی می ماند، اما شی UserCredential به طور متفاوتی بازیابی می شود.

Web

  // Before
  // ==============
  signInWithRedirect(auth, new GoogleAuthProvider());
  // After the page redirects back
  const userCred = await getRedirectResult(auth);

  // After
  // ==============
  const userCred = await signInWithPopup(auth, new GoogleAuthProvider());

Web

  // Before
  // ==============
  firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
  // After the page redirects back
  var userCred = await firebase.auth().getRedirectResult();

  // After
  // ==============
  var userCred = await firebase.auth().signInWithPopup(
      new firebase.auth.GoogleAuthProvider());
```

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

گزینه 3: درخواست های احراز هویت پروکسی به firebaseapp.com

جریان signInWithRedirect با هدایت مجدد از دامنه برنامه شما به دامنه مشخص شده در پارامتر authDomain در پیکربندی firebase (" .firebaseapp.com" به طور پیش‌فرض). authDomain میزبان کد کمکی ورود به سیستم است که به Identity Provider هدایت می‌شود، که در صورت موفقیت، دوباره به دامنه برنامه هدایت می‌شود.

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

  1. یک پروکسی معکوس در سرور برنامه خود تنظیم کنید تا درخواست های GET/POST به https://<app domain>/__/auth/ به https://<project>.firebaseapp.com/__/auth/ ارسال شود. اطمینان حاصل کنید که این ارسال به مرورگر شفاف است. این را نمی توان از طریق تغییر مسیر 302 انجام داد.

    اگر از nginx برای ارائه دامنه سفارشی خود استفاده می کنید، پیکربندی معکوس پروکسی به این صورت خواهد بود:

    # reverse proxy for signin-helpers for popup/redirect sign in.
    location /__/auth {
      proxy_pass https://<project>.firebaseapp.com;
    }
    
  2. مراحل گزینه 1 را برای به روز رسانی مجاز redirect_uri ، URL ACS و authDomain خود دنبال کنید. هنگامی که برنامه خود را مجدداً راه اندازی کردید، دسترسی به فضای ذخیره سازی متقاطع دیگر نباید اتفاق بیفتد.

گزینه 4: کد کمکی ورود به سیستم را در دامنه خود میزبانی کنید

راه دیگر برای حذف دسترسی به فضای ذخیره‌سازی متقاطع، میزبانی خودکار کد کمکی ورود به سیستم Firebase است. با این حال، این رویکرد برای ورود به سیستم اپل یا SAML کار نمی کند. فقط در صورتی از این گزینه استفاده کنید که راه اندازی معکوس پروکسی در گزینه 3 غیر ممکن باشد.

میزبانی کد کمکی مراحل زیر را دارد:

  1. با اجرای دستورات زیر فایل ها را برای میزبانی از مکان <project>.firebaseapp.com دانلود کنید:

    mkdir signin_helpers/ && cd signin_helpers
    wget https://<project>.firebaseapp.com/__/auth/handler
    wget https://<project>.firebaseapp.com/__/auth/handler.js
    wget https://<project>.firebaseapp.com/__/auth/experiments.js
    wget https://<project>.firebaseapp.com/__/auth/iframe
    wget https://<project>.firebaseapp.com/__/auth/iframe.js
    wget https://<project>.firebaseapp.com/__/firebase/init.json
    
  2. فایل های بالا را در دامنه برنامه خود میزبانی کنید. مطمئن شوید که سرور وب شما می تواند به https://<app domain>/__/auth/<filename> و https://<app domain>/__/firebase/init.json پاسخ دهد.

    در اینجا یک نمونه اجرای سرور است که فایل ها را دانلود و میزبانی می کند. توصیه می‌کنیم فایل‌ها را به صورت دوره‌ای دانلود و همگام‌سازی کنید تا مطمئن شوید که آخرین رفع اشکال و ویژگی‌ها انتخاب شده‌اند.

  3. مراحل موجود در گزینه 1 را برای به روز رسانی مجاز redirect_uri و authDomain خود دنبال کنید. هنگامی که برنامه خود را مجدداً راه اندازی کردید، دسترسی به فضای ذخیره سازی متقاطع دیگر نباید اتفاق بیفتد.

گزینه 5: ورود به سیستم ارائه دهنده را به طور مستقل مدیریت کنید

Firebase Authentication SDK signInWithPopup() و signInWithRedirect() را به عنوان روش‌های راحت برای پیچیده کردن منطق پیچیده و اجتناب از نیاز به درگیر کردن SDK دیگر ارائه می‌کند. می‌توانید با ورود مستقل به ارائه‌دهنده خود، و سپس با استفاده از signInWithCredential() برای مبادله اعتبار ارائه‌دهنده با اعتبار Firebase Authentication، از استفاده از هر یک از روش‌ها به طور کامل اجتناب کنید. برای مثال، می‌توانید از Google Sign In SDK ، کد نمونه برای دریافت اعتبار حساب Google استفاده کنید، سپس با اجرای کد زیر، یک اعتبار جدید Google را نمونه‌سازی کنید:

Web

  // `googleUser` from the onsuccess Google Sign In callback.
  //  googUser = gapi.auth2.getAuthInstance().currentUser.get();
  const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
  const result = await signInWithCredential(auth, credential);

Web

  // `googleUser` from the onsuccess Google Sign In callback.
  const credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token);
  const result = await firebase.auth().signInWithCredential(credential);

بعد از اینکه signInWithCredential() را فراخوانی کردید، بقیه برنامه شما مانند قبل عمل می کند.

دستورالعمل دریافت اعتبار اپل در اینجا آمده است.