به محتوای اصلی

جایگزین احراز هویت فایربیس؛ چرا فیلترشکن مشکل را حل نمی‌کند

دو دامنه‌ای که Firebase Auth لازم دارد از ایران رد می‌شوند؛ تست کنترل‌شده‌اش را آورده‌ایم. چرا VPN شما کاربر شما را نجات نمی‌دهد و رمزها موقع مهاجرت چه می‌شوند.

عاطفه امیری۵ دقیقه مطالعه
در این مطلب

خلاصه‌ی جواب: احراز هویت فایربیس از ایران کار نمی‌کند، و دلیلش هم فیلترینگ داخلی نیست که با فیلترشکن حل شود — خودِ گوگل درخواست را رد می‌کند. این را در شهریور ۱۴۰۵ مستقیم تست کردیم و پایین‌تر عدد و متن خطایش را آورده‌ایم. مهم‌تر اینکه فیلترشکن شما مشکل کاربر شما را حل نمی‌کند، و همین نکته است که در مقاله‌های فارسی موجود جا افتاده.

جایگزین احراز هویت فایربیس چیست؟

جایگزین Firebase Authentication هر سرویسی است که سه کار آن را انجام بدهد — ثبت‌نام و ورود کاربر نهایی، صدور توکن، و محدود کردن دسترسی هر کاربر به داده‌ی خودش — بدون اینکه به دامنه‌های گوگل وابسته باشد. برای تیم ایرانی گزینه‌ی عملی معمولاً ورود با کد پیامکی روی یک بک‌اند داخلی است، چون شماره‌ی موبایل چیزی است که همه دارند و نیاز به هیچ سرویس خارجی ندارد. اگر بک‌اند خودتان را دارید، پیاده‌سازی JWT هم گزینه است. آنچه گزینه نیست، نگه داشتن فایربیس با فیلترشکن است — و دلیلش در بخش بعد.

فایربیس دقیقاً کجا رد می‌شود؟

احراز هویت فایربیس در عمل با دو دامنه حرف می‌زند: یکی برای ثبت‌نام و ورود، و یکی برای تمدید توکن. در ۱۵ شهریور ۱۴۰۵ از یک سرور داخل ایران هر دو را صدا زدیم:

دامنهنقشپاسخ از IP ایران
identitytoolkit.googleapis.comثبت‌نام و ورود‏۴۰۳ — رد شد
securetoken.googleapis.comتمدید توکن‏۴۰۳ — رد شد
firebase.google.comسایت و مستندات‏۴۰۳ — رد شد
google.comشاهد‏۲۰۰ — باز شد
fonts.googleapis.comشاهد‏۲۰۰ — باز شد

دو ردیف آخر عمداً آنجاست. اگر فقط سه ردیف اول را می‌دیدید، می‌شد گفت «آی‌پی این سرور کلاً پیش گوگل بد است». ولی همان لحظه و از همان آی‌پی، google.com و سرویس فونت گوگل با کد ۲۰۰ باز شدند. یعنی مسئله مختص همان دامنه‌هایی است که احراز هویت به آن‌ها نیاز دارد.

متن خطا هم دقیقاً این است:

403. That's an error.
Your client does not have permission to get URL
/v1/accounts:signUp from this server.

این تست از یک سرور دیتاسنتری داخل ایران گرفته شده. روش را عمداً نوشتیم تا خودتان بتوانید تکرارش کنید — نه اینکه حرف ما را قبول کنید. یک curl به همان دامنه از شبکه‌ی خودتان کافی است.

چرا فیلترشکن جواب نمی‌دهد

این مهم‌ترین بخش مقاله است و در نتایج فارسی موجود اشتباه نوشته شده.

آن ۴۰۳ را گوگل بر اساس آی‌پی درخواست‌کننده صادر می‌کند. وقتی شما روی لپ‌تاپتان فیلترشکن روشن می‌کنید، آی‌پی درخواست‌کننده در زمان توسعه عوض می‌شود و همه‌چیز کار می‌کند. ولی اپلیکیشنی که منتشر می‌کنید روی گوشی کاربر عادی اجرا می‌شود و همان گوشی است که به identitytoolkit.googleapis.com درخواست می‌زند. کاربر شما فیلترشکن ندارد. نتیجه: دکمه‌ی «ورود» برای او کار نمی‌کند، در حالی که روی دستگاه شما بی‌عیب بود.

این بدترین شکل خرابی است، چون در تست خودتان دیده نمی‌شود.

ادعای رایج دیگر این است که «فقط بعضی روش‌های ورود بسته‌اند». گزارش‌های توسعه‌دهنده‌ها هم مسیر رمز عبور و هم مسیر ورود با حساب‌های دیگر را پوشش می‌دهند؛ یعنی تفکیکی در کار نیست.

تله‌ی دوم: ورود پیامکی به گوگل پلی وصل است

فرض کنید مسئله‌ی دسترسی حل شد. ورود با شماره‌ی موبایل فایربیس یک وابستگی دارد که کمتر گفته می‌شود: برای اینکه مطمئن شود درخواست از یک دستگاه واقعی می‌آید، از Play Integrity استفاده می‌کند. روی دستگاهی که سرویس‌های گوگل پلی ندارد — یعنی بخش قابل توجهی از گوشی‌هایی که اپ را از کافه‌بازار نصب می‌کنند — به reCAPTCHA برمی‌گردد، که آن هم روی دامنه‌های گوگل میزبانی می‌شود. دریافت خودکار کد پیامکی هم به همان سرویس‌های پلی نیاز دارد.

سه چیز دیگر که قبل از تصمیم باید بدانید:

  • ورود پیامکی روی پلن رایگان فایربیس نیست. در جدول قیمت‌گذاری خودشان برای پلن بدون هزینه «قابل اجرا نیست» زده شده؛ یعنی کارت بین‌المللی لازم دارید.
  • هر پیامک به ایران ۰٫۱۹ دلار قیمت خورده — حدود نوزده برابر نرخ آمریکا و کانادا در همان جدول.
  • سیاست منطقه‌ای پیامک برای پروژه‌های جدید هیچ کشوری را مجاز نمی‌داند. باید ایران را دستی به فهرست مجاز اضافه کنید، وگرنه ارسال انجام نمی‌شود.

چه چیزی جایگزین چه چیزی می‌شود

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

مهاجرت: بر سر رمزهای کاربران چه می‌آید؟

اینجا یک واقعیت فنی هست که تصمیم مهاجرت را عوض می‌کند.

خروجی گرفتن از کاربران با یک دستور انجام می‌شود:

firebase auth:export users.json --format=json

خروجی شامل شناسه، ایمیل، شماره و هش رمز به‌همراه salt است. ولی این هش با نسخه‌ی تغییریافته‌ی الگوریتم scrypt ساخته شده که مخصوص خود فایربیس است، نه scrypt استاندارد. یعنی مقصد جدید فقط وقتی می‌تواند رمزهای قدیمی را بپذیرد که دقیقاً همان الگوریتم و چهار پارامتر پیکربندی پروژه‌ی شما را پیاده کند.

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

راه عملی که این کل مسئله را دور می‌زند: به‌جای انتقال رمزها، ورود با کد پیامکی بگذارید. کاربر با همان شماره‌ی همیشگی وارد می‌شود، هیچ رمزی لازم نیست منتقل شود، و تجربه‌ی کاربر هم بهتر می‌شود.

پیاده‌سازی جایگزین با فیکارو

در فیکارو هر پروژه از ابتدا موجودیت کاربر و اندپوینت‌های آماده دارد؛ لازم نیست احراز هویت را بسازید. ورود پیامکی دو درخواست است:

POST /v1/auth/otp/send
{ "mobile": "09XXXXXXXXX" }

POST /v1/auth/otp/verify
{ "mobile": "09XXXXXXXXX", "code": "482913" }

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

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

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

جمع‌بندی

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

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

سوالات متداول

آیا با فیلترشکن می‌شود از احراز هویت فایربیس در ایران استفاده کرد؟
برای خودتان در زمان توسعه معمولاً بله، ولی این مشکل را حل نمی‌کند. خطای ۴۰۳ را گوگل بر اساس آی‌پی درخواست‌کننده صادر می‌کند، و درخواست ورود از گوشی کاربر شما ارسال می‌شود نه از دستگاه شما. کاربری که فیلترشکن ندارد نمی‌تواند وارد شود، در حالی که همه‌چیز در تست شما درست کار می‌کرد.
کدام دامنه‌های فایربیس از ایران باز نمی‌شوند؟
در تست ۱۵ شهریور ۱۴۰۵ از یک سرور داخل ایران، دو دامنه‌ای که احراز هویت به آن‌ها نیاز دارد — identitytoolkit.googleapis.com برای ثبت‌نام و ورود و securetoken.googleapis.com برای تمدید توکن — هر دو کد ۴۰۳ برگرداندند. در همان لحظه google.com و fonts.googleapis.com از همان آی‌پی کد ۲۰۰ دادند، پس بلاک عمومی آی‌پی نبود.
اگر از فایربیس مهاجرت کنم رمز کاربرانم را از دست می‌دهم؟
دستور خروجی فایربیس هش رمزها را می‌دهد، ولی با نسخه‌ی تغییریافته‌ی scrypt مخصوص خودش؛ مقصد جدید باید دقیقاً همان را پیاده کند. ضمناً کاربرانی که قبلاً از جای دیگر وارد فایربیس شده‌اند و هنوز یک بار لاگین نکرده‌اند، با هش خالی خروجی می‌گیرند. راه عملی‌تر این است که به‌جای انتقال رمز، ورود با کد پیامکی بگذارید.
ورود پیامکی فایربیس روی گوشی بدون سرویس‌های گوگل کار می‌کند؟
به‌طور کامل نه. فایربیس برای تأیید اصالت دستگاه از Play Integrity استفاده می‌کند و روی دستگاه بدون سرویس‌های گوگل پلی به reCAPTCHA برمی‌گردد که آن هم روی دامنه‌های گوگل است. دریافت خودکار کد پیامکی هم به همان سرویس‌ها نیاز دارد. برای کاربری که اپ را از کافه‌بازار نصب کرده این یک ریسک واقعی است.

مطالب مرتبط