توفیق حمزه‌ ئی
توفیق حمزه‌ ئی
خواندن ۴ دقیقه·۵ سال پیش

یک نکته ناگفته در مورد پکیج laravel sanctum

laravel sanctum
laravel sanctum

دوستان فکر کنم به اندازه کافی طریقه استفاده از sanctum و نصبش هم توی وب وجود داره برای همین در اینجا اینا رو من توضیح نمیدم بلکه یه نکته در این قسمت بهش میپردازم اونم مربوط میشه به روت sanctum/csrf-cookie که دقیقا چیه و ایا واقعا همیشه اینو لازم داریم؟

ولی اول کمی توضیحات در مورد laravel sanctum

میشه گفت این پکیج جایگزین laravel passport هست برای اپلیکیشن هایی که نیازی به پیچیدگی OAuth ندارن برای همین استفاده از اون راحت تر هستش اما در کنار سادگی استفاده از اون ایمن ترم شده. کمی بعد به شیوه محافظت اون میپردازم الان این پکیج هم برای SPA و توکن های ساده و برای موبایل استفاده داره. که میتونین اطلاعات کامل رو در داکیومنت ها پیدا کنید اینجا


چجوری sanctum از اپ ما محافظت میکنه؟

در این جا فقط از روش SPA ها صحبت میکنم. در این پکیج برای احراز هویت در واقع از سشن استفاده میشه ولی مگه میشه؟?
اگه درایور سشن کوکی باشه بله ولی سشن ها در لاراول توی فایل web.php ستارت میشن برای همین باید روت های auth رو ببرین به اونجا خب حالا چون از توکن استفاده نمیکنیم بنابراین در صورت حمله xss نشت اطلاعاتی نداریم ولی یه مشکلی به وجود میاد اونم اینه برای روت های post داخل این فایل باید توکن csrf هم همراه درخواست فرستاده بشه و این مارو در برابر حملات csrf ایمن میکنه ولی باز چجوری بفرستیم این قسمت رو ما توی پروژه فرانتمون این قسمت رو نداریم. حالا میرسیم به روت csrf-cookie


کار روت csrf-cookie چیه؟

توی داک لاراول گفته چون این روت لاگین نیاز به توکن csrf داره باید اول یه درخواست به اونجا بفرستیم یعنی به این شکلی:

axios.get('/sanctum/csrf-cookie').then(response => { // login حالا تازه میتونیم توی اینجا درخواست رو بفرستیم به });

بیاییم و یه نگاه دقیق تر داشته باشیم به این درخواست:

روت csrf-cookie برای ست توکن های csrf
روت csrf-cookie برای ست توکن های csrf

خب حالا توی اینجا ستاتوس برابر هست با 204 که یعنی هیچ محتوایی بازگشت داده نشده که در واقه هیچی هم نیاز نداریم تنها چیزی که مورد توجه ماست این دوتا هدری هستن که توی رسپانس یا جواب از سمت سرور به ما برگشت داده شده که درواقع میان و دوتا کوکی ذخیره میکنن یکی XSRF-TOKEN و laravel_session این کار مارو راه میندازه یعنی الان میتونیم بدون مشکل به سمت لاگین درخواست بدیم (بدون این که به اررور معروف 419 بخوریم).

الان به این شکلی از دو اتک تا حد زیادی در امان میمونیم. ?

اما واقعا به این csrf-cookie نیاز داریم؟

تقریبا میشه گفت در اکثر سناریو ها بله. ولی اگه لاراول و بخش فرانتمون باهم قاطی شده باشه دیگه واقعا نیاز نیست که هیچ کار کاملا اشتباهی هم هست. سوال اینه چرا؟ و اینکه پس چجوری لاراول توکن csrf تشخیص میده؟

خب توجه شما به هدرهای یه صفحه ساده لاراول نسخه 7 که تازه نصب شده جلب میکنم.

درخواست get به صفحه اصلی
درخواست get به صفحه اصلی

خب همین جوری که مشاهده میکنین لاراول خودش میاد اینا رو توی هر درخواست ارسال میکنه به رسپانس پس چرا بیایم و خودمون اونو دوباره ست کنیم

اگه به بخش application براوزر دقت کنیم:

کوکی های ذخیره شده در لاراول
کوکی های ذخیره شده در لاراول

بله همین جوری که میبینیم اینا به درستی ست شدن

پس میتونیم به این شکلی فقط و فقط یه درخواست ارسال کنیم

درخواست لاگین در laravel sanctum
درخواست لاگین در laravel sanctum

میبینیم اررور 419 به عنوان ستاتوس برگشت نمیده. پس مشکلمون در اینجا هم برطرف میشه


جمع بندی

اگه یک اپلیکیشن دارین که فقط به صورت first party هست قطعا این پکیج میتونه بهتون کمک کنه هم ساده تر هست هم ایمن تر. اما در مورد این قسمت که گفتم ممکنه به این روت نیاز نداشته باشین حتما توجه داشته باشید که SANCTUM_STATEFUL_DOMAINS و SESSION_DOMAIN عین هم باشن و این که درخواستتون حتما از لاراول باید عبور کنه

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

کانال برای بروز بودن در لاراول

گروه برنامه نویسان لاراول ایران

laravelphpلاراول
برنامه نویس :)
شاید از این پست‌ها خوشتان بیاید