برنامه نویسی

احراز هویت Laravel 11.x Sanctum SPA با Postman!

برای کسانی که با لاراول آشنا نیستند، این یک فریمورک وب PHP یکپارچه بسیار محبوب است که شبیه به سایرین مانند Ruby on Rails است. این به دلیل سهولت استفاده، توسعه سریع و لذت‌بخش‌تر کردن توسعه PHP شناخته شده است!

PHP یک میم زبان بد است

Sanctum یک بسته رسمی لاراول است که برای ارائه یک سیستم احراز هویت پر وزن برای SPAها و APIهای ساده طراحی شده است. Sanctum ساده ترین راه برای افزودن احراز هویت به برنامه لاراول است.

Sanctum یک رویکرد توکن API را ارائه می‌کند که برای احراز هویت APIها و برنامه‌های تلفن همراه طراحی شده است، که تنظیم آن نسبتاً آسان است. از سوی دیگر، روش احراز هویت SPA مبتنی بر کوکی می تواند برای پیکربندی کاملاً گیج کننده باشد. که مایه تاسف است زیرا این روشی است که اکثر مردم از آن استفاده خواهند کرد.

بنابراین در اینجا قصد دارم به شما نشان دهم که چگونه احراز هویت Sanctum SPA را در Laravel 11.x پیکربندی کنید و آن را با Postman آزمایش کنید. من همچنین یک پیکربندی Axios را برای احراز هویت آسان از SPA شما نیز اضافه می کنم!

توجه داشته باشید: روش احراز هویت SPA فقط در صورتی کار می کند که درخواست از یک دامنه باشد، اما می تواند از زیر دامنه های مختلف باشد. مثلا website.com می تواند احراز هویت شود api.website.com.

با مستندات Sanctum در اینجا همراه باشید.

نصب و پیکربندی Sanctum

لاراول به‌طور پیش‌فرض احراز هویت را شامل نمی‌شود، اما دستورات Artisan را برای نصب و داربست Sanctum ارائه می‌کند. چند فایلی را که به آن نیاز دارید، مانند مهاجرت پایگاه داده و فایل پیکربندی مخصوص Sanctum تولید می کند.

php artisan install:api
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیکربندی دامنه های شخص اول شما

در شما .env فایلی که می خواهید دامنه ای را اضافه کنید که از آن درخواست ها را می پذیرید. این برای تأیید استفاده خواهد شد Referer هدر، و اگر پیدا نشد Origin سرتیتر.

SANCTUM_STATEFUL_DOMAINS=website.com
- or -
SANCTUM_STATEFUL_DOMAINS=spa.website.com
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Sanctum Middleware

داخل bootstrap/app.php شما می خواهید میان افزار API stateful را به کل برنامه اضافه کنید، این کار را می توان با موارد زیر انجام داد. بدون این میان افزار، هیچ مسیری توسط auth:sanctum میان افزار شکست خواهد خورد.

->withMiddleware(function (Middleware $middleware) {
    //
    $middleware->statefulApi();
})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

CORS و کوکی ها

تقریباً برای هر برنامه‌ای که می‌خواهید CORS را فعال کنید، Sanctum به آن نیاز دارد که به درستی کار کند. با موارد زیر می توانید به راحتی پیکربندی آن را داربست کنید:

php artisan config:publish cors
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این باعث ایجاد config/cors.php فایل. در این فایل شما به سادگی نیاز به تنظیم supports_credentials به true. این کار از مسدود شدن کوکی ها توسط CORS جلوگیری می کند.

در نهایت برای این بخش باید آن را ویرایش کنید SESSION_DOMAIN در شما .env فایل. شما می خواهید آن را به دامنه SPA خود تغییر دهید یا می توانید آن را با یک پیشوند قرار دهید . تا همه زیر دامنه ها را بپذیرد.

مثلا .website.com به هر زیر دامنه ای اجازه می دهد.

ورود به سیستم در

بنابراین اکنون ما همه چیز را برای تأیید توکن ها در اختیار داریم، اما باید مسیر ورود به سیستم را ایجاد کنیم که ایمیل و رمز عبور ما را تأیید کند و آن را با جلسه ما مرتبط کند.

شما به راحتی می توانید موارد زیر را به خود اضافه کنید routes/web.php

use Illuminate\Support\Facades\Auth;

Route::post('/login', function () {
    $credentials = $request->validate([
        'email' => ['required', 'email'],
        'password' => ['required'],
    ]);

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();

        return Response([
            'message' => 'Successful login!'
        ], 200);
    }

    return Response([
        'message' => 'Mismatch email and password!'
    ], 401);
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما همچنین می توانید از مثال ارائه شده توسط لاراول پیروی کنید، اما مانند بالا JSON را برنمی گرداند، بلکه یک پاسخ تغییر مسیر می دهد.

پیکربندی مجموعه پستچی

قبل از اینکه Postman را پیکربندی کنیم، می‌خواهم به طور خلاصه در مورد عملیات مورد نیاز برای ورود به سیستم صحبت کنم.

First Sanctum به ما نیاز دارد که به آن ضربه بزنیم /sanctum/csrf-cookie نقطه پایانی با a GET درخواست. این یک درخواست 204 را برمی گرداند به این معنی که موفقیت آمیز بود اما محتوایی ندارد، فقط حاوی کوکی های جلسه ما است.

سپس ما می توانیم یک POST درخواست به تازه ایجاد شده ما /login مسیر با یک email و password در بدنه برای احراز هویت و مرتبط کردن کاربر احراز هویت شده با جلسه مطابق با توکن صادر شده در مرحله قبلی ما.

اکنون ما کاملاً احراز هویت شده‌ایم و می‌توانیم با عبور از کوکی به همراه هدر از هر مسیر محافظت‌شده sanctum استفاده کنیم. X-XSRF-TOKEN حاوی مقدار تجزیه شده کوکی در درخواست است. این را می توان با ارسال یک درخواست به تست کرد /api/user مسیری که به طور پیش فرض درج شده است.

نگران نباشید Postman و Axios می توانند به راحتی کوکی ها و هدرها را برای ما مدیریت کنند!

مجموعه پستچی

می‌توانید این مجموعه Laravel 11.x Sanctum SPA را برای ادامه دانلود کنید.

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

const jar = pm.cookies.jar();

jar.get("http://localhost:5174", "XSRF-TOKEN", (err, cookie) => {

    pm.request.addHeader({
        key: "X-XSRF-TOKEN",
        value: cookie
    });

    pm.request.addHeader({
        key: "Origin",
        value: "http://localhost:5174"
    });

    pm.request.addHeader({
        key: "Referer",
        value: "http://localhost:5174"
    });

});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این اسکریپت قبل از هر درخواست اجرا می‌شود و کوکی‌های پیدا شده برای منبع داده شده را تجزیه می‌کند و آنها را به آن اضافه می‌کند X-XSRF-TOKEN سرتیتر. همچنین هر دو را تنظیم می کند Referer و Origin سرصفحه ای که حرم به آن نیاز دارد.

ممکن است متوجه شوید که من آن را تنظیم کرده ام Referer و Origin سربرگ به localhost:5174 این فقط به این دلیل است که یک پورت رایج برای برنامه های SPA ساخته شده با Vite است!

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

نحوه مشاهده کوکی ها در پستچی

نحوه مجاز کردن کوکی ها در پستچی

نحوه اضافه کردن ریشه های کوکی در پستچی

پیکربندی Axios

Axios یک سرویس گیرنده HTTP مبتنی بر وعده برای جاوا اسکریپت است که به شما یک روش بسیار آسان برای کار با درخواست های HTTP می دهد. در مورد ما، نقاط پیکربندی را ارائه می دهد که کار با Sanctum را بسیار آسان می کند.

import axios from 'axios';

let axiosInstance = axios.create({
    baseURL: 'http://localhost',
    timeout: 1000,
    headers: {
        Accept: 'application/json'
    },
    withCredentials: true,
    withXSRFToken: true,
    xsrfCookieName: "XSRF-TOKEN",
    xsrfHeaderName: "X-XSRF-TOKEN",
});

export default axiosInstance;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با بررسی پیکربندی بالا، اگر با Axios آشنایی داشته باشید، می بینید که پیکربندی Axios بسیار ساده است به جز 4 پیکربندی:

  • با اعتبار
  • با توکن XSRF
  • xsrfCookieName
  • xsrfHeaderName

اجازه دهید ابتدا بحث کنیم withCredentials. این گزینه به Axios می‌گوید کوکی‌های یافت شده در مرورگر را که مبدا را دسته‌بندی می‌کنند به درخواست پیوست کند.

بعدی است withXSRFToken. این گزینه به Axios می گوید که هدر XSRF را فقط برای درخواست هایی با همان مبدا تنظیم کند.

سرانجام xsrfCookieName و xsrfHeaderName به Axios بگویید کدام کوکی را برای هدر تجزیه کند و نام سرصفحه را ضمیمه کند. هر دو گزینه به طور پیش فرض مقادیر داده شده در پیکربندی بالا را که Sanctum انتظار دارد، تعیین می کنند.

اکنون هر درخواستی که با این نمونه Axios انجام شود با احراز هویت Laravel Sanctum SPA سازگار خواهد بود!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا