labZero:~$ cd ./lab / lab-sanctum-subdomain-cs...

المختبر
v0.1 قابل للاستخدام 1 يونيو 2026

Sanctum وSPA على subdomain: مصيدة CSRF لا تظهر في التطوير

تسجيل الدخول يعمل على localhost ويفشل بـ 419 في الإنتاج — SESSION_DOMAIN بدون نقطة والـ cookie لا يعبر الـ subdomain.

#Laravel #Sanctum #Security

السياق

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 لا يكذب، لكنه لا يكشف كل شيء.

هل تشبه فكرتك هذا المشروع؟

إذا كان لديك مشروع قريب من هذه الفكرة، يمكننا الحديث عنه.

لنتحدّث عنها