لاراول پناهگاه
- معرفی
- نصب و راه اندازی
- پیکربندی
- API Token Authentication
- احراز هویت SPA
- احراز هویت اپلیکیشن موبایل
- آزمایش کردن
معرفی
Laravel Sanctum یک سیستم احراز هویت پر وزن برای SPA ها (برنامه های تک صفحه ای)، برنامه های کاربردی تلفن همراه و API های ساده و مبتنی بر توکن ارائه می کند. Sanctum به هر کاربر برنامه شما اجازه می دهد تا چندین توکن API برای حساب خود ایجاد کند. ممکن است به این نشانهها تواناییها/حوزههایی داده شود که مشخص میکند توکنها مجاز به انجام چه اقداماتی هستند.
چگونه کار می کند
Laravel Sanctum برای حل دو مشکل جداگانه وجود دارد. بیایید قبل از کاوش بیشتر در کتابخانه در مورد هر کدام بحث کنیم.
توکن های API
اول، Sanctum یک بسته ساده است که میتوانید از آن برای صدور توکنهای API برای کاربران خود بدون پیچیدگی OAuth استفاده کنید. این ویژگی با الهام از GitHub و سایر برنامههایی است که "توکنهای دسترسی شخصی" را صادر میکنند. برای مثال، تصور کنید «تنظیمات حساب» برنامه شما دارای صفحهای است که در آن کاربر ممکن است یک توکن API برای حساب خود ایجاد کند. می توانید از Sanctum برای تولید و مدیریت آن توکن ها استفاده کنید. این توکنها معمولاً دارای زمان انقضا بسیار طولانی (سالها) هستند، اما ممکن است در هر زمانی توسط کاربر به صورت دستی لغو شوند.
Laravel Sanctum این ویژگی را با ذخیره توکنهای API کاربر در یک جدول
پایگاه داده و احراز هویت درخواستهای HTTP دریافتی از طریق هدر ارائه میدهد
Authorization
که باید حاوی یک نشانه API معتبر باشد.
احراز هویت SPA
دوم، Sanctum برای ارائه یک راه ساده برای تأیید اعتبار برنامههای تک صفحهای (SPA) که نیاز به برقراری ارتباط با API مبتنی بر لاراول دارند، وجود دارد. این SPA ها ممکن است در همان مخزن برنامه Laravel شما وجود داشته باشند یا ممکن است یک مخزن کاملاً مجزا باشند، مانند SPA که با استفاده از Vue CLI یا یک برنامه Next.js ایجاد شده است.
برای این ویژگی، Sanctum از هیچ نوع توکن استفاده نمی کند. در عوض، Sanctum
از خدمات احراز هویت جلسه مبتنی بر کوکی های داخلی لاراول استفاده می کند. به طور معمول، Sanctum از محافظ احراز
هویت لاراول
web
برای انجام این کار استفاده می کند. این مزایای حفاظت CSRF، احراز هویت
جلسه، و همچنین محافظت در برابر نشت اعتبارنامه های احراز هویت از طریق XSS را فراهم می کند.
Sanctum تنها زمانی با استفاده از کوکیها احراز هویت را انجام میدهد که
درخواست دریافتی از frontend SPA شما باشد. وقتی Sanctum یک درخواست HTTP ورودی را بررسی میکند، ابتدا یک کوکی
احراز هویت را بررسی میکند و اگر هیچ کدام وجود نداشته باشد، Sanctum هدر را
Authorization
برای یک توکن API معتبر بررسی میکند.
استفاده از Sanctum فقط برای احراز هویت توکن API یا فقط برای احراز هویت SPA کاملاً خوب است. فقط به این دلیل که از Sanctum استفاده می کنید به این معنی نیست که شما ملزم به استفاده از هر دو ویژگی آن نیستید.
نصب و راه اندازی
جدیدترین نسخه های لاراول در حال حاضر شامل Laravel Sanctum هستند. با این حال، اگر فایل برنامه شما
composer.json
شامل نیستlaravel/sanctum
، میتوانید دستورالعملهای نصب زیر را دنبال کنید.
می توانید Laravel Sanctum را از طریق مدیر بسته Composer نصب کنید:
composer require laravel/sanctum
در مرحله بعد، باید فایل های پیکربندی و مهاجرت Sanctum را با استفاده از
vendor:publish
دستور Artisan منتشر کنید. فایل
sanctum
پیکربندی در فهرست برنامه شما قرار می گیرد
config
:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
در نهایت، شما باید مهاجرت های پایگاه داده خود را اجرا کنید. Sanctum یک جدول پایگاه داده ایجاد می کند تا توکن های API را در آن ذخیره کند:
php artisan migrate
در مرحله بعد، اگر قصد دارید از Sanctum برای احراز هویت یک SPA استفاده
کنید، باید میان افزار Sanctum را به
api
گروه میان افزار خود در فایل برنامه خود اضافه کنید
app/Http/Kernel.php
:
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class,],
سفارشی سازی مهاجرت
اگر نمیخواهید از مهاجرتهای پیشفرض Sanctum استفاده کنید، باید متد را
Sanctum::ignoreMigrations
در
register
متد کلاس خود فراخوانی کنید
App\Providers\AppServiceProvider
. با اجرای دستور زیر می توانید مهاجرت های پیش فرض را صادر کنید:
php artisan vendor:publish --tag=sanctum-migrations
پیکربندی
نادیده گرفتن مدل های پیش فرض
اگرچه معمولاً مورد نیاز نیست، اما میتوانید
PersonalAccessToken
مدل مورد استفاده داخلی توسط Sanctum را گسترش دهید:
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken; class PersonalAccessToken extends SanctumPersonalAccessToken{ // ...}
سپس، ممکن است به Sanctum دستور دهید که از مدل سفارشی شما از طریق
usePersonalAccessTokenModel
روش ارائه شده توسط Sanctum استفاده کند. به طور معمول، شما باید این روش را
در
boot
روش یکی از ارائه دهندگان خدمات برنامه خود فراخوانی کنید:
use App\Models\Sanctum\PersonalAccessToken;use Laravel\Sanctum\Sanctum; /** * Bootstrap any application services. * * @return void */public function boot(){ Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);}
API Token Authentication
شما نباید از نشانه های API برای احراز هویت SPA شخص اول خود استفاده کنید. در عوض، از ویژگیهای احراز هویت داخلی SPA Sanctum استفاده کنید .
صدور توکن های API
Sanctum به شما امکان میدهد تا توکنهای API/توکنهای دسترسی شخصی را صادر
کنید که ممکن است برای احراز هویت درخواستهای API به برنامه شما استفاده شوند. هنگام درخواست با استفاده از
توکنهای API، توکن باید در
Authorization
هدر بهعنوان یک
Bearer
توکن درج شود.
برای شروع صدور توکن برای کاربران، مدل کاربر شما باید از این
Laravel\Sanctum\HasApiTokens
ویژگی استفاده کند:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable{ use HasApiTokens, HasFactory, Notifiable;}
برای صدور توکن، می توانید از این
createToken
روش استفاده کنید. متد
createToken
یک
Laravel\Sanctum\NewAccessToken
نمونه را برمی گرداند. توکنهای API قبل از ذخیره شدن در پایگاه داده شما با
استفاده از هش SHA-256 هش میشوند، اما میتوانید با استفاده از
plainTextToken
ویژگی
NewAccessToken
نمونه به مقدار متن ساده توکن دسترسی پیدا کنید. شما باید این مقدار را
بلافاصله پس از ایجاد توکن به کاربر نمایش دهید:
use Illuminate\Http\Request; Route::post('/tokens/create', function (Request $request) { $token = $request->user()->createToken($request->token_name); return ['token' => $token->plainTextToken];});
tokens
شما می توانید با استفاده از رابطه Eloquent ارائه شده توسط این ویژگی
به تمام نشانه های کاربر دسترسی داشته باشید
HasApiTokens
:
foreach ($user->tokens as $token) { //}
توانایی های توکن
Sanctum به شما امکان می دهد "توانایی" را به نشانه ها اختصاص دهید.
تواناییها هدفی مشابه «محدودههای OAuth» دارند. می توانید آرایه ای از توانایی های رشته ای را به عنوان
آرگومان دوم به
createToken
متد ارسال کنید:
return $user->createToken('token-name', ['server:update'])->plainTextToken;
هنگام رسیدگی به یک درخواست ورودی که توسط Sanctum احراز هویت شده است،
میتوانید با استفاده از روش زیر تعیین کنید که آیا توکن دارای توانایی خاصی است
tokenCan
:
if ($user->tokenCan('server:update')) { //}
میان افزار قابلیت توکن
Sanctum همچنین شامل دو میانافزار است که ممکن است برای تأیید صحت یک
درخواست دریافتی با توکنی استفاده شود که توانایی مشخصی به آن داده شده است. برای شروع، میان افزار زیر را به
$routeMiddleware
ویژگی فایل برنامه خود اضافه کنید
app/Http/Kernel.php
:
'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
میانافزار
abilities
ممکن است به مسیری اختصاص داده شود تا تأیید کند که رمز درخواست ورودی همه
تواناییهای فهرستشده را دارد:
Route::get('/orders', function () { // Token has both "check-status" and "place-orders" abilities...})->middleware(['auth:sanctum', 'abilities:check-status,place-orders']);
میان
ability
افزار ممکن است به مسیری اختصاص داده شود تا تأیید کند که رمز درخواست ورودی
حداقل یکی
از توانایی های فهرست شده را دارد:
Route::get('/orders', function () { // Token has the "check-status" or "place-orders" ability...})->middleware(['auth:sanctum', 'ability:check-status,place-orders']);
درخواستهای آغاز شده از UI شخص اول
برای راحتی کار،
اگر درخواست احراز هویت شده دریافتی از SPA شخص اول شما باشد و از
احراز هویت داخلی Sanctum در SPA
tokenCan
استفاده میکنید، این روش همیشه برمیگردد
.
true
با این حال، این لزوماً به این معنا نیست که برنامه شما باید به کاربر اجازه انجام این عمل را بدهد. به طور معمول، خطمشیهای مجوز برنامه شما تعیین میکند که آیا توکن مجوز انجام تواناییها را دریافت کرده است و همچنین بررسی میکند که خود نمونه کاربر باید مجاز به انجام این عمل باشد.
به عنوان مثال، اگر برنامهای را تصور کنیم که سرورها را مدیریت میکند، این ممکن است به معنای بررسی این باشد که آیا توکن برای بهروزرسانی سرورها مجاز است و آیا سرور متعلق به کاربر است:
return $request->user()->id === $server->user_id && $request->user()->tokenCan('server:update')
در ابتدا، اجازه دادن به
tokenCan
متد برای فراخوانی و بازگشت همیشه
true
برای درخواستهای آغاز شده توسط UI شخص اول ممکن است عجیب به نظر برسد. با
این حال، راحت است که بتوان همیشه فرض کرد که یک توکن API در دسترس است و می توان از طریق این
tokenCan
روش بازرسی کرد. با اتخاذ این رویکرد، میتوانید همیشه این
tokenCan
روش را در خطمشیهای مجوزهای برنامه خود فراخوانی کنید، بدون اینکه نگران
این باشید که آیا درخواست از UI برنامه شما راهاندازی شده است یا توسط یکی از مصرفکنندگان شخص ثالث API شما
آغاز شده است.
حفاظت از مسیرها
برای محافظت از مسیرها به طوری که تمام درخواست های دریافتی باید احراز هویت
شوند، باید
sanctum
محافظ احراز هویت را به مسیرهای محافظت شده خود در فایل های مسیر
routes/web.php
و
routes/api.php
مسیر خود متصل کنید. اگر درخواست از طرف شخص ثالث باشد، این محافظ اطمینان
حاصل میکند که درخواستهای دریافتی بهعنوان درخواستهای احراز هویت شده یا احراز هویت کوکی تأیید میشوند یا
حاوی یک سرآیند توکن API معتبر هستند.
ممکن است تعجب کنید که چرا پیشنهاد می کنیم مسیرهای موجود در
routes/web.php
فایل برنامه خود را با استفاده از
sanctum
گارد احراز هویت کنید. به یاد داشته باشید که Sanctum ابتدا سعی می کند
درخواست های دریافتی را با استفاده از کوکی احراز هویت جلسه معمولی لاراول احراز هویت کند. اگر آن کوکی وجود
نداشته باشد، Sanctum سعی خواهد کرد با استفاده از یک نشانه در
Authorization
هدر درخواست، درخواست را تأیید کند. علاوه بر این، احراز هویت همه
درخواستها با استفاده از Sanctum تضمین میکند که همیشه میتوانیم متد را
tokenCan
در نمونه کاربر تأیید شده فعلی فراخوانی کنیم:
use Illuminate\Http\Request; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user();});
ابطال توکن ها
شما میتوانید توکنها را با حذف آنها از پایگاه داده خود با استفاده از
tokens
رابطهای که توسط این ویژگی ارائه میشود، «لغو» کنید
Laravel\Sanctum\HasApiTokens
:
// Revoke all tokens...$user->tokens()->delete(); // Revoke the token that was used to authenticate the current request...$request->user()->currentAccessToken()->delete(); // Revoke a specific token...$user->tokens()->where('id', $tokenId)->delete();
انقضای توکن
بهطور پیشفرض، توکنهای Sanctum هرگز منقضی نمیشوند و ممکن است تنها با
لغو توکن
باطل شوند . با این حال، اگر میخواهید زمان انقضا را برای توکنهای API
برنامه خود پیکربندی کنید، میتوانید این کار را از طریق
expiration
گزینه پیکربندی تعریف شده در فایل پیکربندی برنامه خود انجام دهید
sanctum
. این گزینه پیکربندی، تعداد دقیقههایی را مشخص میکند که یک توکن صادر شده
منقضی شده در نظر گرفته شود:
'expiration' => 525600,
اگر زمان انقضای رمز را برای برنامه خود پیکربندی کرده اید، ممکن است
بخواهید
یک کار
برای هرس کردن توکن های منقضی شده برنامه خود نیز برنامه ریزی کنید.
خوشبختانه، Sanctum شامل یک
sanctum:prune-expired
دستور Artisan است که می توانید برای انجام این کار از آن استفاده کنید. به
عنوان مثال، میتوانید یک کار زمانبندیشده را برای حذف تمام رکوردهای پایگاه داده رمز منقضی که حداقل 24 ساعت
منقضی شدهاند پیکربندی کنید:
$schedule->command('sanctum:prune-expired --hours=24')->daily();
احراز هویت SPA
Sanctum همچنین برای ارائه یک روش ساده برای تأیید اعتبار برنامههای تک صفحهای (SPA) که نیاز به ارتباط با API مبتنی بر لاراول دارند، وجود دارد. این SPA ها ممکن است در همان مخزن برنامه لاراول شما وجود داشته باشند یا ممکن است یک مخزن کاملا مجزا باشند.
برای این ویژگی، Sanctum از هیچ نوع توکن استفاده نمی کند. در عوض، Sanctum از خدمات احراز هویت جلسه مبتنی بر کوکی های داخلی لاراول استفاده می کند. این رویکرد برای احراز هویت، مزایای حفاظت CSRF، احراز هویت جلسه، و همچنین محافظت در برابر نشت اعتبارنامه های احراز هویت از طریق XSS را فراهم می کند.
برای احراز هویت، SPA و API شما باید یک دامنه سطح بالا را به اشتراک بگذارند. با این حال، آنها ممکن است در زیر دامنه های مختلف قرار بگیرند. علاوه بر این، باید اطمینان حاصل کنید که
Accept: application/json
هدر را همراه با درخواست خود ارسال می کنید.
پیکربندی
پیکربندی دامنه های شخص اول شما
ابتدا، باید پیکربندی کنید که SPA شما از کدام دامنه ها درخواست می دهد. می
توانید این دامنه ها را با استفاده از
stateful
گزینه پیکربندی موجود در
sanctum
فایل پیکربندی خود پیکربندی کنید. این تنظیمات پیکربندی تعیین میکند که
کدام دامنهها با استفاده از کوکیهای جلسه لاراول هنگام درخواست به API شما، احراز هویت "stateful" را حفظ
کنند.
اگر از طریق یک URL که دارای پورت ( ) است به برنامه خود دسترسی دارید
127.0.0.1:8000
، باید مطمئن شوید که شماره پورت را با دامنه وارد کرده اید.
Sanctum Middleware
در مرحله بعد، باید میان افزار Sanctum را به
api
گروه میان افزار خود در
app/Http/Kernel.php
فایل خود اضافه کنید. این میانافزار مسئول اطمینان از اینکه درخواستهای
دریافتی از SPA شما میتوانند با استفاده از کوکیهای جلسه لاراول احراز هویت شوند، در عین حال به درخواستهای
اشخاص ثالث یا برنامههای تلفن همراه اجازه میدهد تا با استفاده از توکنهای API احراز هویت شوند:
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class,],
CORS و کوکی ها
اگر در تأیید اعتبار برنامه خود از یک SPA که در یک زیر دامنه جداگانه اجرا می شود مشکل دارید، احتمالاً CORS (اشتراک گذاری منبع متقابل) یا تنظیمات کوکی جلسه خود را اشتباه پیکربندی کرده اید.
باید مطمئن شوید که پیکربندی CORS برنامه شما هدر را
Access-Control-Allow-Credentials
با مقدار
True
. این ممکن است با تنظیم گزینه در
فایل پیکربندی
supports_credentials
برنامه شما روی
.
config/cors.php
true
علاوه بر این، باید این
withCredentials
گزینه را در نمونه جهانی برنامه خود فعال کنید
axios
. به طور معمول، این باید در
resources/js/bootstrap.js
فایل شما انجام شود. اگر از Axios برای درخواست HTTP از frontend خود
استفاده نمی کنید، باید پیکربندی معادل آن را در سرویس گیرنده HTTP خود انجام دهید:
axios.defaults.withCredentials = true;
در نهایت، باید مطمئن شوید که پیکربندی دامنه کوکی جلسه برنامه شما از هر
زیر دامنه دامنه ریشه شما پشتیبانی می کند. شما می توانید این کار را با پیشوند دامنه با یک پیشوند
.
در فایل پیکربندی برنامه خود انجام دهید
config/session.php
:
'domain' => '.domain.com',
احراز هویت
حفاظت CSRF
برای احراز هویت SPA، صفحه "ورود" SPA شما باید ابتدا درخواستی را به
/sanctum/csrf-cookie
نقطه پایانی ارسال کند تا حفاظت CSRF را برای برنامه اولیه تنظیم کند:
axios.get('/sanctum/csrf-cookie').then(response => { // Login...});
در طول این درخواست، لاراول یک
XSRF-TOKEN
کوکی حاوی توکن CSRF فعلی تنظیم می کند. سپس این نشانه باید در یک هدر در
درخواست های بعدی ارسال شود
X-XSRF-TOKEN
، که برخی از کتابخانه های سرویس گیرنده HTTP مانند Axios و Angular
HttpClient به طور خودکار برای شما انجام می دهند. اگر کتابخانه HTTP جاوا اسکریپت شما مقداری را برای شما تنظیم
نمی کند، باید هدر را به صورت دستی تنظیم کنید
X-XSRF-TOKEN
تا با مقدار
XSRF-TOKEN
کوکی تنظیم شده توسط این مسیر مطابقت داشته باشد.
ورود به سیستم در
هنگامی که حفاظت CSRF مقداردهی اولیه شد، باید یک
POST
درخواست به مسیر برنامه لاراول خود ارسال کنید
/login
. این
/login
مسیر ممکن است به صورت دستی
یا با استفاده از یک بسته احراز هویت هدلس مانند
Laravel Fortify
پیاده سازی
شود .
اگر درخواست ورود موفقیت آمیز باشد، احراز هویت می شوید و درخواست های بعدی
به مسیرهای برنامه شما به طور خودکار از طریق کوکی جلسه ای که برنامه لاراول برای مشتری شما صادر کرده است،
احراز هویت می شود. علاوه بر این، از آنجایی که برنامه شما قبلاً درخواستی برای
/sanctum/csrf-cookie
مسیر ارسال کرده است، درخواستهای بعدی باید به طور خودکار محافظت CSRF را
دریافت کنند تا زمانی که کلاینت HTTP جاوا اسکریپت شما مقدار
XSRF-TOKEN
کوکی را در
X-XSRF-TOKEN
هدر ارسال کند.
البته اگر جلسه کاربر شما به دلیل عدم فعالیت منقضی شود، درخواست های بعدی به اپلیکیشن لاراول ممکن است پاسخ خطای HTTP 401 یا 419 را دریافت کنند. در این صورت، باید کاربر را به صفحه ورود به سیستم SPA خود هدایت کنید.
شما آزاد هستید که نقطه پایانی خود را بنویسید
/login
. با این حال، باید اطمینان حاصل کنید که با استفاده از سرویسهای احراز هویت استاندارد و مبتنی بر جلسه که لاراول ارائه میکند، کاربر را احراز هویت میکند . به طور معمول، این به معنای استفاده ازweb
محافظ احراز هویت است.
حفاظت از مسیرها
برای محافظت از مسیرها به طوری که تمام درخواست های دریافتی باید احراز هویت
شوند، باید
sanctum
محافظ احراز هویت را به مسیرهای API خود در
routes/api.php
فایل خود متصل کنید. این محافظ تضمین میکند که درخواستهای دریافتی
بهعنوان درخواستهای احراز هویت شده از SPA شما تأیید اعتبار میشوند یا اگر درخواست از طرف شخص ثالث باشد، یک
سرآیند توکن API معتبر دارند:
use Illuminate\Http\Request; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user();});
مجوز کانال های پخش خصوصی
اگر SPA شما نیاز به احراز هویت با
کانالهای پخش خصوصی/حضوری
دارد ، باید
Broadcast::routes
روش فراخوانی را در فایل خود قرار دهید
routes/api.php
:
Broadcast::routes(['middleware' => ['auth:sanctum']]);
در مرحله بعد، برای اینکه درخواستهای مجوز Pusher موفق شوند، باید
authorizer
هنگام مقداردهی اولیه
Laravel Echo
یک Pusher سفارشی ارائه دهید . این به برنامه شما اجازه می دهد تا Pusher
را برای استفاده از
axios
نمونه ای که
به درستی برای درخواست های بین دامنه پیکربندی شده
است، پیکربندی کند :
window.Echo = new Echo({ broadcaster: "pusher", cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, encrypted: true, key: import.meta.env.VITE_PUSHER_APP_KEY, authorizer: (channel, options) => { return { authorize: (socketId, callback) => { axios.post('/api/broadcasting/auth', { socket_id: socketId, channel_name: channel.name }) .then(response => { callback(false, response.data); }) .catch(error => { callback(true, error); }); } }; },})
احراز هویت اپلیکیشن موبایل
همچنین میتوانید از نشانههای Sanctum برای احراز هویت درخواستهای برنامه تلفن همراه خود به API خود استفاده کنید. فرآیند احراز هویت درخواست های برنامه های کاربردی تلفن همراه مشابه احراز هویت درخواست های API شخص ثالث است. با این حال، تفاوت های کوچکی در نحوه صدور توکن های API وجود دارد.
صدور توکن های API
برای شروع، مسیری ایجاد کنید که ایمیل / نام کاربری، رمز عبور و نام دستگاه کاربر را میپذیرد، سپس آن اعتبارنامهها را با یک توکن جدید Sanctum مبادله میکند. "نام دستگاه" داده شده به این نقطه پایانی برای مقاصد اطلاعاتی است و ممکن است هر مقداری که بخواهید باشد. به طور کلی، مقدار نام دستگاه باید نامی باشد که کاربر آن را تشخیص می دهد، مانند «آیفون 12 Nuno».
به طور معمول، از صفحه "ورود" برنامه تلفن همراه خود به نقطه پایانی رمز درخواست می دهید. نقطه پایانی کد API متن ساده را برمی گرداند که ممکن است در دستگاه تلفن همراه ذخیره شود و برای درخواست های API اضافی استفاده شود:
use App\Models\User;use Illuminate\Http\Request;use Illuminate\Support\Facades\Hash;use Illuminate\Validation\ValidationException; Route::post('/sanctum/token', function (Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', 'device_name' => 'required', ]); $user = User::where('email', $request->email)->first(); if (! $user || ! Hash::check($request->password, $user->password)) { throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.'], ]); } return $user->createToken($request->device_name)->plainTextToken;});
هنگامی که برنامه تلفن همراه از توکن برای ارسال درخواست API به برنامه شما
استفاده می کند، باید توکن را در
Authorization
هدر به عنوان یک
Bearer
توکن ارسال کند.
هنگام صدور توکن برای یک برنامه تلفن همراه، می توانید توانایی های توکن را نیز مشخص کنید .
حفاظت از مسیرها
همانطور که قبلاً مستند شده است، میتوانید از مسیرها محافظت کنید به طوری
که تمام درخواستهای دریافتی باید با اتصال
sanctum
محافظ احراز هویت به مسیرها احراز هویت شوند:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user();});
ابطال توکن ها
برای اینکه به کاربران اجازه دهید توکنهای API صادر شده برای دستگاههای
تلفن همراه را لغو کنند، میتوانید آنها را با نام، همراه با دکمه «لغو»، در بخش «تنظیمات حساب» از رابط کاربری
برنامه وب خود فهرست کنید. هنگامی که کاربر روی دکمه "Revoke" کلیک می کند، می توانید رمز را از پایگاه داده حذف
کنید. به یاد داشته باشید، شما می توانید از طریق
tokens
رابطه ای که توسط این ویژگی ارائه می شود، به
نشانه های API کاربر دسترسی داشته باشید
Laravel\Sanctum\HasApiTokens
:
// Revoke all tokens...$user->tokens()->delete(); // Revoke a specific token...$user->tokens()->where('id', $tokenId)->delete();
آزمایش کردن
در حین آزمایش، این
Sanctum::actingAs
روش ممکن است برای احراز هویت یک کاربر و مشخص کردن توانایی هایی که باید به
توکن آنها اعطا شود استفاده شود:
use App\Models\User;use Laravel\Sanctum\Sanctum; public function test_task_list_can_be_retrieved(){ Sanctum::actingAs( User::factory()->create(), ['view-tasks'] ); $response = $this->get('/api/task'); $response->assertOk();}
اگر میخواهید همه تواناییها را به توکن اعطا کنید، باید
*
در لیست تواناییهای ارائهشده به
actingAs
روش بنویسید:
Sanctum::actingAs( User::factory()->create(), ['*']);