labZero:~$ cd ./lab / lab-sanctum-subdomain-cs...
Sanctum وSPA على subdomain: مصيدة CSRF لا تظهر في التطوير
تسجيل الدخول يعمل على localhost ويفشل بـ 419 في الإنتاج — SESSION_DOMAIN بدون نقطة والـ cookie لا يعبر الـ subdomain.
السياق
SPA على app.company.com، API على api.company.com. Sanctum stateful authentication. في بيئة التطوير: localhost:3000 و localhost:8000 — يعمل بلا مشاكل. في staging: /sanctum/csrf-cookie يرجع 204 وكأن كل شيء طبيعي، لكن الطلبات التالية تفشل بـ 419.
الإجراء
فتحت Network tab — XSRF-TOKEN cookie يُخزّن على api.company.com، ليس على .company.com. SPA على subdomain مختلف لا يرى الـ cookie. قارنت أربعة إعدادات: SESSION_DOMAIN=company.com مقابل SESSION_DOMAIN=.company.com، SameSite=Lax مقابل None مع HTTPS، SANCTUM_STATEFUL_DOMAINS بـ wildcard مقابل قيم صريحة. اختبرت على Chrome وSafari — سلوكهما مختلف في SameSite.
النتيجة
الحل الكامل: SESSION_DOMAIN=.company.com (النقطة إلزامية للـ subdomains)، SESSION_SECURE_COOKIE=true، SameSite=None على HTTPS. Safari يرفض cookies cross-subdomain بدون Secure حتى مع نفس الـ eTLD+1. localhost متسامح مع هذه القيود — لذا لم تظهر محلياً أبداً.
الدرس
Sanctum على subdomains منفصلة يحتاج SESSION_DOMAIN بنقطة + HTTPS + اختبار على Safari — localhost لا يكذب، لكنه لا يكشف كل شيء.