پاسپورت لاراول
- معرفی
- نصب و راه اندازی
- پیکربندی
- صدور توکن های دسترسی
- اعطای کد مجوز با PKCE
- رمزهای اعطای رمز عبور
- توکن های اعطای ضمنی
- توکن های اعطای اعتبار مشتری
- توکن های دسترسی شخصی
- حفاظت از مسیرها
- محدوده توکن
- مصرف API خود با جاوا اسکریپت
- مناسبت ها
- آزمایش کردن
معرفی
Laravel Passport یک اجرای کامل سرور OAuth2 را برای برنامه لاراول شما در عرض چند دقیقه فراهم می کند. پاسپورت بر روی سرور League OAuth2 ساخته شده است که توسط اندی میلینگتون و سایمون هامپ نگهداری می شود.
این مستندات فرض میکند که شما قبلاً با OAuth2 آشنا هستید. اگر چیزی در مورد OAuth2 نمی دانید، قبل از ادامه با اصطلاحات و ویژگی های کلی OAuth2 آشنا شوید.
پاسپورت یا پناهگاه؟
قبل از شروع، ممکن است بخواهید تعیین کنید که آیا درخواست شما توسط Laravel Passport یا Laravel Sanctum بهتر ارائه می شود . اگر برنامه شما کاملاً نیاز به پشتیبانی از OAuth2 دارد، باید از Laravel Passport استفاده کنید.
با این حال، اگر میخواهید یک برنامه تک صفحهای، برنامه تلفن همراه یا توکنهای API را تأیید کنید، باید از Laravel Sanctum استفاده کنید . Laravel Sanctum از OAuth2 پشتیبانی نمی کند. با این حال، تجربه توسعه احراز هویت API بسیار سادهتر را فراهم میکند.
نصب و راه اندازی
می توانید Laravel Passport را از طریق
install:api
دستور Artisan نصب کنید:
php artisan install:api --passport
این دستور مهاجرت های پایگاه داده لازم برای ایجاد جداول مورد نیاز برنامه شما برای ذخیره کلاینت های OAuth2 و توکن های دسترسی را منتشر و اجرا می کند. این فرمان همچنین کلیدهای رمزگذاری مورد نیاز برای تولید توکن های دسترسی ایمن را ایجاد می کند.
علاوه بر این، این دستور از شما می پرسد که آیا می خواهید از UUID ها به عنوان مقدار کلید اصلی مدل پاسپورت
Client
به جای افزایش خودکار اعداد صحیح استفاده کنید.
پس از اجرای
install:api
دستور،
Laravel\Passport\HasApiTokens
ویژگی را به
App\Models\User
مدل خود اضافه کنید. این ویژگی چند روش کمکی به مدل شما ارائه می دهد که به شما امکان می دهد توکن و محدوده کاربر تأیید شده را بررسی کنید:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Laravel\Passport\HasApiTokens; class User extends Authenticatable{ use HasApiTokens, HasFactory, Notifiable;}
در نهایت، در فایل پیکربندی برنامه خود
config/auth.php
، باید یک
api
محافظ احراز هویت تعریف کنید و
driver
گزینه را روی
passport
. این به برنامه شما دستور می دهد تا
TokenGuard
هنگام احراز هویت درخواست های API ورودی
از Passport استفاده کند :
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ],],
استقرار پاسپورت
هنگام استقرار Passport برای اولین بار در سرورهای برنامه خود، احتمالاً باید این
passport:keys
دستور را اجرا کنید. این دستور کلیدهای رمزگذاری مورد نیاز Passport را برای تولید نشانه های دسترسی تولید می کند. کلیدهای تولید شده معمولاً در کنترل منبع نگهداری نمی شوند:
php artisan passport:keys
در صورت لزوم، میتوانید مسیری را که کلیدهای پاسپورت باید از آنجا بارگیری شوند، تعیین کنید.
Passport::loadKeysFrom
برای انجام این کار
می توانید از روش استفاده کنید . به طور معمول، این متد باید از
boot
متد کلاس برنامه شما
فراخوانی شود
App\Providers\AppServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ Passport::loadKeysFrom(__DIR__.'/../secrets/oauth');}
بارگیری کلیدها از محیط
همچنین، میتوانید فایل پیکربندی Passport را با استفاده از
vendor:publish
دستور Artisan منتشر کنید:
php artisan vendor:publish --tag=passport-config
پس از انتشار فایل پیکربندی، می توانید کلیدهای رمزگذاری برنامه خود را با تعریف آنها به عنوان متغیرهای محیطی بارگیری کنید:
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----<private key here>-----END RSA PRIVATE KEY-----" PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----<public key here>-----END PUBLIC KEY-----"
ارتقاء پاسپورت
هنگام ارتقاء به نسخه اصلی جدید پاسپورت، مهم است که راهنمای ارتقا را به دقت مرور کنید .
پیکربندی
Client Secret Hashing
اگر می خواهید اسرار مشتری شما هنگام ذخیره در پایگاه داده هش شود، باید متد موجود
Passport::hashClientSecrets
در
boot
متد کلاس خود را فراخوانی کنید
App\Providers\AppServiceProvider
:
use Laravel\Passport\Passport; Passport::hashClientSecrets();
پس از فعال شدن، تمام اسرار مشتری شما بلافاصله پس از ایجاد برای کاربر قابل نمایش خواهند بود. از آنجایی که مقدار مخفی کلاینت متن ساده هرگز در پایگاه داده ذخیره نمی شود، در صورت از بین رفتن مقدار راز امکان بازیابی آن وجود ندارد.
طول عمر رمز
به طور پیش فرض، پاسپورت توکن های دسترسی طولانی مدت را صادر می کند که پس از یک سال منقضی می شوند. اگر میخواهید طول عمر توکن طولانیتر/کوتاهتر را پیکربندی کنید، میتوانید از روشهای
tokensExpireIn
،
refreshTokensExpireIn
و و استفاده کنید
personalAccessTokensExpireIn
. این متدها باید از
boot
متد کلاس برنامه شما
فراخوانی شوند
App\Providers\AppServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ Passport::tokensExpireIn(now()->addDays(15)); Passport::refreshTokensExpireIn(now()->addDays(30)); Passport::personalAccessTokensExpireIn(now()->addMonths(6));}
ستونهای
expires_at
جداول پایگاه داده پاسپورت فقط خواندنی و فقط برای نمایش هستند. هنگام صدور توکن، پاسپورت اطلاعات انقضا را در توکن های امضا شده و رمزگذاری شده ذخیره می کند. اگر نیاز به باطل کردن یک توکن دارید، باید آن را باطل کنید .
نادیده گرفتن مدل های پیش فرض
شما آزاد هستید که مدل های استفاده شده داخلی توسط پاسپورت را با تعریف مدل خود و گسترش مدل پاسپورت مربوطه گسترش دهید:
use Laravel\Passport\Client as PassportClient; class Client extends PassportClient{ // ...}
پس از تعریف مدل خود، می توانید به Passport دستور دهید که از مدل سفارشی شما از طریق
Laravel\Passport\Passport
کلاس استفاده کند. به طور معمول، شما باید Passport را در مورد مدل های سفارشی خود در
boot
روش کلاس برنامه خود اطلاع دهید
App\Providers\AppServiceProvider
:
use App\Models\Passport\AuthCode;use App\Models\Passport\Client;use App\Models\Passport\PersonalAccessClient;use App\Models\Passport\RefreshToken;use App\Models\Passport\Token; /** * Bootstrap any application services. */public function boot(): void{ Passport::useTokenModel(Token::class); Passport::useRefreshTokenModel(RefreshToken::class); Passport::useAuthCodeModel(AuthCode::class); Passport::useClientModel(Client::class); Passport::usePersonalAccessClientModel(PersonalAccessClient::class);}
مسیرهای نادیده گرفته شده
گاهی اوقات ممکن است بخواهید مسیرهای تعریف شده توسط پاسپورت را شخصی سازی کنید. برای رسیدن به این هدف، ابتدا باید مسیرهای ثبت شده توسط پاسپورت را با اضافه کردن
Passport::ignoreRoutes
به
register
روش برنامه خود نادیده بگیرید
AppServiceProvider
:
use Laravel\Passport\Passport; /** * Register any application services. */public function register(): void{ Passport::ignoreRoutes();}
سپس، می توانید مسیرهای تعریف شده توسط Passport در
فایل مسیرهای آن را
در فایل برنامه خود کپی کنید
routes/web.php
و آنها را به دلخواه تغییر دهید:
Route::group([ 'as' => 'passport.', 'prefix' => config('passport.path', 'oauth'), 'namespace' => '\Laravel\Passport\Http\Controllers',], function () { // Passport routes...});
صدور توکن های دسترسی
استفاده از OAuth2 از طریق کدهای مجوز، روشی است که اکثر توسعه دهندگان با OAuth2 آشنا هستند. هنگام استفاده از کدهای مجوز، یک برنامه مشتری کاربر را به سرور شما هدایت می کند، جایی که آنها درخواست صدور رمز دسترسی به مشتری را تأیید یا رد می کنند.
مدیریت مشتریان
ابتدا، توسعهدهندگانی که برنامههایی را میسازند که نیاز به تعامل با API برنامه شما دارند، باید برنامه خود را با ایجاد یک «کلینت» در اپلیکیشن شما ثبت کنند. به طور معمول، این شامل ارائه نام برنامه و یک URL است که برنامه شما می تواند پس از تأیید درخواست مجوز توسط کاربران، به آن هدایت شود.
دستور
passport:client
ساده ترین راه برای ایجاد مشتری استفاده از
passport:client
دستور Artisan است. این دستور ممکن است برای ایجاد کلاینت های خود برای آزمایش عملکرد OAuth2 استفاده شود. هنگامی که دستور را اجرا می کنید
client
، Passport از شما می خواهد اطلاعات بیشتری در مورد مشتری خود دریافت کنید و یک شناسه مشتری و راز را در اختیار شما قرار می دهد:
php artisan passport:client
تغییر مسیر URL ها
اگر میخواهید چندین URL تغییر مسیر را برای مشتری خود مجاز کنید، میتوانید آنها را با استفاده از یک لیست محدود شده با کاما در زمانی که دستور URL از شما خواسته میشود، مشخص کنید
passport:client
. هر نشانی اینترنتی که حاوی کاما است باید URL کدگذاری شده باشد:
http://example.com/callback,http://examplefoo.com/callback
JSON API
از آنجایی که کاربران برنامه شما نمی توانند از این
client
دستور استفاده کنند، Passport یک API JSON ارائه می دهد که می توانید از آن برای ایجاد کلاینت استفاده کنید. این کار شما را از مشکل کدنویسی دستی کنترلرها برای ایجاد، بهروزرسانی و حذف کلاینتها نجات میدهد.
با این حال، باید API JSON Passport را با ظاهر خود جفت کنید تا داشبوردی برای کاربران خود فراهم کنید تا مشتریان خود را مدیریت کنند. در زیر، همه نقاط پایانی API را برای مدیریت مشتریان بررسی میکنیم. برای راحتی، از Axios برای نشان دادن درخواست های HTTP به نقاط پایانی استفاده می کنیم .
JSON API توسط میان افزار
web
و
auth
میان افزار محافظت می شود. بنابراین، ممکن است فقط از برنامه خود شما فراخوانی شود. امکان فراخوانی از منبع خارجی وجود ندارد.
GET /oauth/clients
این مسیر همه کلاینت ها را برای کاربر احراز هویت شده برمی گرداند. این در درجه اول برای فهرست کردن همه مشتریان کاربر مفید است تا آنها بتوانند آنها را ویرایش یا حذف کنند:
axios.get('/oauth/clients') .then(response => { console.log(response.data); });
POST /oauth/clients
این مسیر برای ایجاد مشتریان جدید استفاده می شود. به دو داده نیاز دارد: مشتری
name
و
redirect
URL. URL
redirect
جایی است که کاربر پس از تأیید یا رد درخواست مجوز هدایت می شود.
هنگامی که یک کلاینت ایجاد می شود، شناسه مشتری و راز مشتری برای آن صادر می شود. این مقادیر هنگام درخواست نشانه های دسترسی از برنامه شما استفاده می شود. مسیر ایجاد مشتری، نمونه مشتری جدید را برمی گرداند:
const data = { name: 'Client Name', redirect: 'http://example.com/callback'}; axios.post('/oauth/clients', data) .then(response => { console.log(response.data); }) .catch (response => { // List errors on response... });
PUT /oauth/clients/{client-id}
این مسیر برای به روز رسانی کلاینت ها استفاده می شود. به دو داده نیاز دارد: مشتری
name
و
redirect
URL. URL
redirect
جایی است که کاربر پس از تأیید یا رد درخواست مجوز هدایت می شود. مسیر نمونه مشتری به روز شده را برمی گرداند:
const data = { name: 'New Client Name', redirect: 'http://example.com/callback'}; axios.put('/oauth/clients/' + clientId, data) .then(response => { console.log(response.data); }) .catch (response => { // List errors on response... });
DELETE /oauth/clients/{client-id}
این مسیر برای حذف کلاینت ها استفاده می شود:
axios.delete('/oauth/clients/' + clientId) .then(response => { // ... });
درخواست توکن
تغییر مسیر برای مجوز
هنگامی که یک کلاینت ایجاد شد، توسعه دهندگان ممکن است از شناسه مشتری و راز خود برای درخواست کد مجوز و رمز دسترسی از برنامه شما استفاده کنند. ابتدا، برنامه مصرف کننده باید یک درخواست تغییر مسیر به مسیر برنامه شما
/oauth/authorize
مانند زیر ارسال کند:
use Illuminate\Http\Request;use Illuminate\Support\Str; Route::get('/redirect', function (Request $request) { $request->session()->put('state', $state = Str::random(40)); $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://third-party-app.com/callback', 'response_type' => 'code', 'scope' => '', 'state' => $state, // 'prompt' => '', // "none", "consent", or "login" ]); return redirect('http://passport-app.test/oauth/authorize?'.$query);});
این
prompt
پارامتر ممکن است برای تعیین رفتار احراز هویت برنامه Passport استفاده شود.
اگر
prompt
مقدار باشد
none
، اگر کاربر قبلاً با برنامه پاسپورت احراز هویت نشده باشد، پاسپورت همیشه یک خطای احراز هویت می دهد. اگر مقدار باشد
consent
، پاسپورت همیشه صفحه تأیید مجوز را نشان میدهد، حتی اگر همه دامنهها قبلاً به برنامه مصرفکننده اعطا شده باشد. وقتی مقدار است
login
، برنامه پاسپورت همیشه از کاربر می خواهد که دوباره به برنامه وارد شود، حتی اگر قبلاً یک جلسه موجود داشته باشد.
اگر
prompt
مقداری ارائه نشده باشد، تنها در صورتی از کاربر درخواست مجوز میشود که قبلاً مجوز دسترسی به برنامه مصرفکننده برای محدودههای درخواستی را نداشته باشد.
به یاد داشته باشید،
/oauth/authorize
مسیر قبلاً توسط پاسپورت تعریف شده است. نیازی به تعریف دستی این مسیر ندارید.
تایید درخواست
هنگام دریافت درخواست های مجوز، پاسپورت به طور خودکار بر اساس مقدار
prompt
پارامتر (در صورت وجود) پاسخ می دهد و ممکن است الگویی را به کاربر نمایش دهد که به کاربر اجازه می دهد درخواست مجوز را تأیید یا رد کند. اگر آنها درخواست را تأیید کنند، به همان چیزی که
redirect_uri
توسط برنامه مصرف کننده مشخص شده است هدایت می شوند. باید با
URL که هنگام ایجاد مشتری مشخص شده بود
redirect_uri
مطابقت داشته باشد .
redirect
اگر میخواهید صفحه تأیید مجوز را سفارشی کنید، میتوانید نماهای پاسپورت را با استفاده از
vendor:publish
دستور Artisan منتشر کنید. نماهای منتشر شده در
resources/views/vendor/passport
دایرکتوری قرار خواهند گرفت:
php artisan vendor:publish --tag=passport-views
گاهی اوقات ممکن است بخواهید از درخواست مجوز صرفنظر کنید، مانند زمانی که یک مشتری شخص اول را مجوز می دهید. شما می توانید این کار را با
گسترش
Client
مدل
و تعریف یک
skipsAuthorization
روش انجام دهید. در صورت
skipsAuthorization
بازگرداندن
true
، کلاینت تأیید می شود و کاربر فوراً به برنامه بازگردانده می شود
redirect_uri
، مگر اینکه برنامه مصرف کننده به صراحت
prompt
پارامتر را هنگام هدایت مجدد برای مجوز تنظیم کرده باشد:
<?php namespace App\Models\Passport; use Laravel\Passport\Client as BaseClient; class Client extends BaseClient{ /** * Determine if the client should skip the authorization prompt. */ public function skipsAuthorization(): bool { return $this->firstParty(); }}
تبدیل کدهای مجوز به توکن های دسترسی
اگر کاربر درخواست مجوز را تأیید کند، به برنامه مصرف کننده هدایت می شود. مصرف کننده ابتدا باید
state
پارامتر را در برابر مقداری که قبل از تغییر مسیر ذخیره شده بود تأیید کند. اگر پارامتر حالت مطابقت داشته باشد، مصرف کننده باید
POST
درخواستی برای درخواست توکن دسترسی به برنامه شما بدهد. درخواست باید شامل کد مجوزی باشد که زمانی که کاربر درخواست مجوز را تأیید کرد، توسط برنامه شما صادر شده است:
use Illuminate\Http\Request;use Illuminate\Support\Facades\Http; Route::get('/callback', function (Request $request) { $state = $request->session()->pull('state'); throw_unless( strlen($state) > 0 && $state === $request->state, InvalidArgumentException::class, 'Invalid state value.' ); $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'authorization_code', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'redirect_uri' => 'http://third-party-app.com/callback', 'code' => $request->code, ]); return $response->json();});
این مسیر یک پاسخ JSON حاوی
,
و ویژگی ها
/oauth/token
را برمی گرداند
. این
ویژگی حاوی تعداد ثانیه هایی است که تا زمانی که نشانه دسترسی منقضی شود.
access_token
refresh_token
expires_in
expires_in
مانند
/oauth/authorize
مسیر،/oauth/token
مسیر نیز با پاسپورت برای شما تعریف می شود. نیازی به تعریف دستی این مسیر نیست.
JSON API
پاسپورت همچنین دارای یک API JSON برای مدیریت توکن های دسترسی مجاز است. میتوانید این را با ظاهر خود جفت کنید تا به کاربران خود داشبوردی برای مدیریت توکنهای دسترسی ارائه دهید. برای راحتی، از
Axios
برای نشان دادن درخواست های HTTP به نقاط پایانی
استفاده می کنیم .
JSON API توسط میان افزار
web
و
auth
میان افزار محافظت می شود. بنابراین، ممکن است فقط از برنامه خود شما فراخوانی شود.
GET /oauth/tokens
این مسیر تمام نشانه های دسترسی مجاز را که کاربر احراز هویت شده ایجاد کرده است، برمی گرداند. این در درجه اول برای فهرست کردن تمام نشانه های کاربر مفید است تا آنها بتوانند آنها را باطل کنند:
axios.get('/oauth/tokens') .then(response => { console.log(response.data); });
DELETE /oauth/tokens/{token-id}
این مسیر ممکن است برای لغو نشانههای دسترسی مجاز و نشانههای تازهسازی مرتبط با آنها استفاده شود:
axios.delete('/oauth/tokens/' + tokenId);
نشانه های تازه کردن
اگر برنامه شما کدهای دسترسی کوتاه مدت صادر می کند، کاربران باید نشانه های دسترسی خود را از طریق نشانه رفرشی که هنگام صدور نشانه دسترسی به آنها ارائه شده است، بازخوانی کنند:
use Illuminate\Support\Facades\Http; $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'refresh_token', 'refresh_token' => 'the-refresh-token', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'scope' => '',]); return $response->json();
این مسیر یک پاسخ JSON حاوی
,
و ویژگی ها
/oauth/token
را برمی گرداند
. این
ویژگی حاوی تعداد ثانیه هایی است که تا زمانی که نشانه دسترسی منقضی شود.
access_token
refresh_token
expires_in
expires_in
ابطال توکن ها
شما می توانید با استفاده از
revokeAccessToken
روش موجود در
Laravel\Passport\TokenRepository
. میتوانید نشانههای بهروزرسانی یک نشانه را با استفاده از
revokeRefreshTokensByAccessTokenId
روش موجود در ابطال کنید
Laravel\Passport\RefreshTokenRepository
. این کلاس ها ممکن است با استفاده از
کانتینر سرویس
لاراول حل شوند
:
use Laravel\Passport\TokenRepository;use Laravel\Passport\RefreshTokenRepository; $tokenRepository = app(TokenRepository::class);$refreshTokenRepository = app(RefreshTokenRepository::class); // Revoke an access token...$tokenRepository->revokeAccessToken($tokenId); // Revoke all of the token's refresh tokens...$refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
پاکسازی توکن ها
هنگامی که توکن ها باطل یا منقضی شدند، ممکن است بخواهید آنها را از پایگاه داده پاک کنید. دستور Artisan
شامل پاسپورت
passport:purge
می تواند این کار را برای شما انجام دهد:
# Purge revoked and expired tokens and auth codes...php artisan passport:purge # Only purge tokens expired for more than 6 hours...php artisan passport:purge --hours=6 # Only purge revoked tokens and auth codes...php artisan passport:purge --revoked # Only purge expired tokens and auth codes...php artisan passport:purge --expired
همچنین میتوانید یک
کار زمانبندیشده را
در فایل برنامهتان پیکربندی کنید
routes/console.php
تا بهطور خودکار توکنهایتان را بر اساس یک زمانبندی هرس کند:
use Laravel\Support\Facades\Schedule; Schedule::command('passport:purge')->hourly();
اعطای کد مجوز با PKCE
اعطای کد مجوز با "کلید اثبات برای تبادل کد" (PKCE) راهی امن برای احراز هویت برنامه های کاربردی تک صفحه ای یا برنامه های کاربردی بومی برای دسترسی به API شما است. این کمک هزینه زمانی باید استفاده شود که نمیتوانید تضمین کنید که راز مشتری بهطور محرمانه ذخیره میشود یا به منظور کاهش خطر رهگیری کد مجوز توسط مهاجم. ترکیبی از "تأیید کننده کد" و "چالش کد" جایگزین رمز مشتری در هنگام مبادله کد مجوز برای یک نشانه دسترسی می شود.
ایجاد مشتری
قبل از اینکه برنامه شما بتواند از طریق اعطای کد مجوز با PKCE توکن صادر کند، باید یک کلاینت با قابلیت PKCE ایجاد کنید. می توانید این کار را با استفاده از
passport:client
دستور Artisan با
--public
گزینه زیر انجام دهید:
php artisan passport:client --public
درخواست توکن
تأیید کننده کد و چالش کد
از آنجایی که این اعطای مجوز یک راز مشتری ارائه نمیکند، توسعهدهندگان باید ترکیبی از تأییدکننده کد و چالش کد را برای درخواست یک رمز ایجاد کنند.
تأییدکننده کد باید یک رشته تصادفی بین 43 تا 128 کاراکتر باشد که شامل حروف، اعداد و نویسههای
، ,
"-"
,
همانطور
که در
مشخصات RFC 7636
تعریف شده است .
"."
"_"
"~"
چالش کد باید یک رشته رمزگذاری شده Base64 با URL و کاراکترهای ایمن برای نام فایل باشد. کاراکترهای
انتهایی
'='
باید حذف شوند و هیچ خط شکنی، فضای خالی یا سایر کاراکترهای اضافی نباید وجود داشته باشد.
$encoded = base64_encode(hash('sha256', $code_verifier, true)); $codeChallenge = strtr(rtrim($encoded, '='), '+/', '-_');
تغییر مسیر برای مجوز
هنگامی که یک کلاینت ایجاد شد، می توانید از شناسه مشتری و تأیید کننده کد تولید شده و چالش کد برای درخواست کد مجوز و رمز دسترسی از برنامه خود استفاده کنید. ابتدا، برنامه مصرف کننده باید یک درخواست تغییر مسیر به
/oauth/authorize
مسیر برنامه شما ارسال کند:
use Illuminate\Http\Request;use Illuminate\Support\Str; Route::get('/redirect', function (Request $request) { $request->session()->put('state', $state = Str::random(40)); $request->session()->put( 'code_verifier', $code_verifier = Str::random(128) ); $codeChallenge = strtr(rtrim( base64_encode(hash('sha256', $code_verifier, true)) , '='), '+/', '-_'); $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://third-party-app.com/callback', 'response_type' => 'code', 'scope' => '', 'state' => $state, 'code_challenge' => $codeChallenge, 'code_challenge_method' => 'S256', // 'prompt' => '', // "none", "consent", or "login" ]); return redirect('http://passport-app.test/oauth/authorize?'.$query);});
تبدیل کدهای مجوز به توکن های دسترسی
اگر کاربر درخواست مجوز را تأیید کند، به برنامه مصرف کننده هدایت می شود. مصرف کننده باید
state
پارامتر را در برابر مقداری که قبل از تغییر مسیر ذخیره شده است، تأیید کند، همانطور که در اعطای کد مجوز استاندارد وجود دارد.
اگر پارامتر حالت مطابقت داشته باشد، مصرف کننده باید
POST
درخواستی برای درخواست توکن دسترسی به برنامه شما صادر کند. این درخواست باید شامل کد مجوزی باشد که زمانی که کاربر درخواست مجوز را تأیید کرد توسط برنامه شما صادر شده است به همراه تأییدکننده کد اولیه ایجاد شده:
use Illuminate\Http\Request;use Illuminate\Support\Facades\Http; Route::get('/callback', function (Request $request) { $state = $request->session()->pull('state'); $codeVerifier = $request->session()->pull('code_verifier'); throw_unless( strlen($state) > 0 && $state === $request->state, InvalidArgumentException::class ); $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'authorization_code', 'client_id' => 'client-id', 'redirect_uri' => 'http://third-party-app.com/callback', 'code_verifier' => $codeVerifier, 'code' => $request->code, ]); return $response->json();});
رمزهای اعطای رمز عبور
ما دیگر استفاده از رمزهای اعطای رمز عبور را توصیه نمی کنیم. در عوض، باید نوع کمک مالی را انتخاب کنید که در حال حاضر توسط OAuth2 Server توصیه شده است .
اعطای رمز عبور OAuth2 به دیگر مشتریان شخص اول شما، مانند یک برنامه تلفن همراه، اجازه می دهد تا با استفاده از آدرس ایمیل / نام کاربری و رمز عبور، رمز دسترسی به دست آورند. این به شما امکان میدهد تا توکنهای دسترسی را به طور ایمن برای مشتریان شخص اول خود صادر کنید، بدون اینکه کاربران خود را ملزم به گذراندن کل جریان تغییر مسیر کد مجوز OAuth2 کنید.
برای فعال کردن اعطای رمز عبور،
enablePasswordGrant
متد موجود در
boot
متد کلاس برنامه خود را فراخوانی کنید
App\Providers\AppServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ Passport::enablePasswordGrant();}
ایجاد یک مشتری اعطای رمز عبور
قبل از اینکه برنامه شما بتواند از طریق اعطای رمز عبور توکن صادر کند، باید یک کلاینت اعطای رمز عبور ایجاد کنید. می توانید این کار را با استفاده از
passport:client
دستور Artisan با
--password
گزینه انجام دهید.
اگر قبلاً دستور را اجرا کرده اید
passport:install
، نیازی به اجرای این دستور ندارید:
php artisan passport:client --password
درخواست توکن
هنگامی که یک کلاینت اعطای رمز عبور ایجاد کردید، می توانید با ارسال یک
POST
درخواست به
/oauth/token
مسیر با آدرس ایمیل و رمز عبور کاربر، یک نشانه دسترسی درخواست کنید. به یاد داشته باشید، این مسیر قبلاً توسط پاسپورت ثبت شده است، بنابراین نیازی به تعریف دستی آن نیست. اگر درخواست موفقیت آمیز باشد، پاسخ JSON را از سرور دریافت خواهید
access_token
کرد
refresh_token
:
use Illuminate\Support\Facades\Http; $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'password', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'username' => 'taylor@laravel.com', 'password' => 'my-password', 'scope' => '',]); return $response->json();
به یاد داشته باشید که توکن های دسترسی به طور پیش فرض عمر طولانی دارند. با این حال، در صورت نیاز می توانید حداکثر طول عمر رمز دسترسی خود را پیکربندی کنید .
درخواست همه دامنه ها
هنگام استفاده از اعطای رمز عبور یا اعطای اعتبار مشتری، ممکن است بخواهید توکن را برای همه حوزههای پشتیبانی شده توسط برنامه خود تأیید کنید. شما می توانید این کار را با درخواست
*
دامنه انجام دهید. اگر دامنه را درخواست کنید
*
،
can
متد موجود در نمونه توکن همیشه برمیگردد
true
. این محدوده ممکن است فقط به یک توکن اختصاص داده شود که با استفاده از
password
یا
client_credentials
کمک مالی صادر می شود:
use Illuminate\Support\Facades\Http; $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'password', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'username' => 'taylor@laravel.com', 'password' => 'my-password', 'scope' => '*',]);
سفارشی کردن ارائه دهنده کاربر
اگر برنامه شما از بیش از یک
ارائهدهنده کاربر احراز هویت
--provider
استفاده میکند، میتوانید با ارائه گزینهای هنگام ایجاد سرویس گیرنده از طریق دستور
، مشخص کنید که مشتری اعطای رمز عبور از کدام ارائهدهنده کاربری استفاده میکند
artisan passport:client --password
. نام ارائه دهنده داده شده باید با ارائه دهنده معتبر تعریف شده در فایل پیکربندی برنامه شما مطابقت داشته باشد
config/auth.php
. سپس میتوانید
با استفاده از میانافزار از مسیر خود محافظت کنید
تا مطمئن شوید که فقط کاربرانی از ارائهدهنده مشخصشده گارد مجاز هستند.
سفارشی کردن فیلد نام کاربری
هنگام احراز هویت با استفاده از اعطای رمز عبور، Passport
email
از ویژگی مدل قابل احراز هویت شما به عنوان "نام کاربری" استفاده می کند. با این حال، می توانید این رفتار را با تعریف
findForPassport
روشی در مدل خود سفارشی کنید:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Laravel\Passport\HasApiTokens; class User extends Authenticatable{ use HasApiTokens, Notifiable; /** * Find the user instance for the given username. */ public function findForPassport(string $username): User { return $this->where('username', $username)->first(); }}
سفارشی کردن اعتبارسنجی رمز عبور
هنگام احراز هویت با استفاده از اعطای رمز عبور، Passport
password
از ویژگی مدل شما برای تأیید اعتبار رمز عبور داده شده استفاده می کند. اگر مدل شما ویژگی ندارد
password
یا میخواهید منطق اعتبارسنجی رمز عبور را سفارشی کنید، میتوانید
validateForPassportPasswordGrant
روشی را بر روی مدل خود تعریف کنید:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Illuminate\Support\Facades\Hash;use Laravel\Passport\HasApiTokens; class User extends Authenticatable{ use HasApiTokens, Notifiable; /** * Validate the password of the user for the Passport password grant. */ public function validateForPassportPasswordGrant(string $password): bool { return Hash::check($password, $this->password); }}
توکن های اعطای ضمنی
ما دیگر استفاده از نشانههای اعطایی ضمنی را توصیه نمیکنیم. در عوض، باید نوع کمک مالی را انتخاب کنید که در حال حاضر توسط OAuth2 Server توصیه شده است .
کمک هزینه ضمنی مشابه اعطای کد مجوز است. با این حال، توکن بدون تبادل کد مجوز به مشتری بازگردانده می شود. این کمک هزینه بیشتر برای جاوا اسکریپت یا برنامه های تلفن همراه استفاده می شود که در آنها اعتبار مشتری نمی تواند به طور ایمن ذخیره شود. برای فعال کردن کمک هزینه،
enableImplicitGrant
متد را در
boot
متد کلاس برنامه خود فراخوانی کنید
App\Providers\AppServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ Passport::enableImplicitGrant();}
پس از فعال شدن کمک هزینه، توسعه دهندگان ممکن است از شناسه مشتری خود برای درخواست رمز دسترسی از برنامه شما استفاده کنند. برنامه مصرف کننده باید یک درخواست تغییر مسیر به مسیر برنامه شما
/oauth/authorize
مانند زیر ارسال کند:
use Illuminate\Http\Request; Route::get('/redirect', function (Request $request) { $request->session()->put('state', $state = Str::random(40)); $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://third-party-app.com/callback', 'response_type' => 'token', 'scope' => '', 'state' => $state, // 'prompt' => '', // "none", "consent", or "login" ]); return redirect('http://passport-app.test/oauth/authorize?'.$query);});
به یاد داشته باشید،
/oauth/authorize
مسیر قبلاً توسط پاسپورت تعریف شده است. نیازی به تعریف دستی این مسیر ندارید.
توکن های اعطای اعتبار مشتری
اعطای اعتبار مشتری برای احراز هویت ماشین به ماشین مناسب است. برای مثال، ممکن است از این کمک هزینه در یک کار برنامه ریزی شده استفاده کنید که وظایف تعمیر و نگهداری را از طریق یک API انجام می دهد.
قبل از اینکه برنامه شما بتواند از طریق اعطای اعتبار مشتری، توکن صادر کند، باید یک مشتری اعطای اعتبار مشتری ایجاد کنید. می توانید این کار را با استفاده از
--client
گزینه
passport:client
دستور Artisan انجام دهید:
php artisan passport:client --client
در مرحله بعد، برای استفاده از این نوع کمک هزینه، یک نام مستعار میان افزار برای
CheckClientCredentials
میان افزار ثبت کنید. میتوانید در
bootstrap/app.php
فایل برنامه خود، نام مستعار میانافزار را تعریف کنید:
use Laravel\Passport\Http\Middleware\CheckClientCredentials; ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'client' => CheckClientCredentials::class ]);})
سپس میان افزار را به یک مسیر وصل کنید:
Route::get('/orders', function (Request $request) { ...})->middleware('client');
client
برای محدود کردن دسترسی به مسیر به محدودههای خاص، میتوانید هنگام اتصال میانافزار به مسیر
، فهرستی از محدودههای مورد نیاز با کاما ارائه دهید :
Route::get('/orders', function (Request $request) { ...})->middleware('client:check-status,your-scope');
بازیابی توکن ها
برای بازیابی یک نشانه با استفاده از این نوع کمک هزینه، یک درخواست به
oauth/token
نقطه پایانی ارسال کنید:
use Illuminate\Support\Facades\Http; $response = Http::asForm()->post('http://passport-app.test/oauth/token', [ 'grant_type' => 'client_credentials', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'scope' => 'your-scope',]); return $response->json()['access_token'];
توکن های دسترسی شخصی
گاهی اوقات، کاربران شما ممکن است بخواهند بدون عبور از جریان تغییر مسیر کد مجوز معمولی، توکن های دسترسی را برای خود صادر کنند. اجازه دادن به کاربران برای صدور نشانه برای خود از طریق UI برنامه شما می تواند برای اجازه دادن به کاربران برای آزمایش با API شما مفید باشد یا ممکن است به عنوان یک رویکرد ساده تر برای صدور توکن های دسترسی به طور کلی باشد.
اگر برنامه شما عمدتاً از Passport برای صدور توکن های دسترسی شخصی استفاده می کند، از Laravel Sanctum ، کتابخانه سبک وزن لاراول برای صدور توکن های دسترسی API استفاده کنید.
ایجاد یک کلاینت دسترسی شخصی
قبل از اینکه برنامه شما بتواند توکن های دسترسی شخصی صادر کند، باید یک کلاینت دسترسی شخصی ایجاد کنید. می توانید این کار را با اجرای
passport:client
دستور Artisan با
--personal
گزینه انجام دهید. اگر قبلاً دستور را اجرا کرده اید
passport:install
، نیازی به اجرای این دستور ندارید:
php artisan passport:client --personal
پس از ایجاد مشتری دسترسی شخصی خود، شناسه مشتری و مقدار مخفی متن ساده را در
.env
فایل برنامه خود قرار دهید:
PASSPORT_PERSONAL_ACCESS_CLIENT_ID="client-id-value"PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET="unhashed-client-secret-value"
مدیریت توکن های دسترسی شخصی
هنگامی که یک کلاینت دسترسی شخصی ایجاد کردید، می توانید با استفاده از
createToken
روش موجود در
App\Models\User
نمونه مدل، توکن هایی را برای یک کاربر مشخص صادر کنید. این
createToken
متد نام نشانه را به عنوان اولین آرگومان خود و یک آرایه اختیاری از
دامنه ها
را به عنوان آرگومان دوم می پذیرد:
use App\Models\User; $user = User::find(1); // Creating a token without scopes...$token = $user->createToken('Token Name')->accessToken; // Creating a token with scopes...$token = $user->createToken('My Token', ['place-orders'])->accessToken;
JSON API
پاسپورت همچنین دارای یک API JSON برای مدیریت توکن های دسترسی شخصی است. میتوانید این را با ظاهر خود جفت کنید تا به کاربران خود داشبوردی برای مدیریت نشانههای دسترسی شخصی ارائه دهید. در زیر، تمام نقاط پایانی API را برای مدیریت نشانههای دسترسی شخصی بررسی میکنیم. برای راحتی، از Axios برای نشان دادن درخواست های HTTP به نقاط پایانی استفاده می کنیم .
JSON API توسط میان افزار
web
و
auth
میان افزار محافظت می شود. بنابراین، ممکن است فقط از برنامه خود شما فراخوانی شود. امکان فراخوانی از منبع خارجی وجود ندارد.
GET /oauth/scopes
این مسیر تمام محدوده های تعریف شده برای برنامه شما را برمی گرداند. میتوانید از این مسیر برای فهرست کردن دامنههایی که کاربر ممکن است به یک نشانه دسترسی شخصی اختصاص دهد استفاده کنید:
axios.get('/oauth/scopes') .then(response => { console.log(response.data); });
GET /oauth/personal-access-tokens
این مسیر تمام نشانه های دسترسی شخصی را که کاربر احراز هویت شده ایجاد کرده است، برمی گرداند. این در درجه اول برای فهرست کردن تمام نشانه های کاربر مفید است تا آنها بتوانند آنها را ویرایش یا لغو کنند:
axios.get('/oauth/personal-access-tokens') .then(response => { console.log(response.data); });
POST /oauth/personal-access-tokens
این مسیر توکن های دسترسی شخصی جدیدی ایجاد می کند. به دو قطعه داده نیاز دارد: نشانه
name
و داده ای
scopes
که باید به توکن اختصاص داده شود:
const data = { name: 'Token Name', scopes: []}; axios.post('/oauth/personal-access-tokens', data) .then(response => { console.log(response.data.accessToken); }) .catch (response => { // List errors on response... });
DELETE /oauth/personal-access-tokens/{token-id}
این مسیر ممکن است برای لغو نشانه های دسترسی شخصی استفاده شود:
axios.delete('/oauth/personal-access-tokens/' + tokenId);
حفاظت از مسیرها
از طریق Middleware
پاسپورت شامل یک
محافظ احراز هویت
است که توکن های دسترسی را در درخواست های دریافتی تأیید می کند. هنگامی که
api
محافظ را برای استفاده از درایور
پیکربندی کردید
passport
، فقط باید
auth:api
میان افزار را در مسیرهایی که باید به یک نشانه دسترسی معتبر نیاز داشته باشند، مشخص کنید:
Route::get('/user', function () { // ...})->middleware('auth:api');
اگر از اعطای اعتبار مشتری استفاده می کنید ، باید به جای میان افزار از
client
auth:api
میان افزار برای محافظت از مسیرهای خود استفاده کنید .
گاردهای احراز هویت چندگانه
اگر برنامه شما انواع مختلفی از کاربران را احراز هویت می کند که احتمالاً از مدل های Eloquent کاملاً متفاوت استفاده می کنند، احتمالاً باید برای هر نوع ارائه دهنده کاربر در برنامه خود یک پیکربندی محافظ تعریف کنید. این به شما امکان می دهد از درخواست هایی که برای ارائه دهندگان کاربر خاص در نظر گرفته شده است محافظت کنید. به عنوان مثال، با توجه به پیکربندی محافظ زیر،
config/auth.php
فایل پیکربندی:
'api' => [ 'driver' => 'passport', 'provider' => 'users',], 'api-customers' => [ 'driver' => 'passport', 'provider' => 'customers',],
مسیر زیر از
api-customers
محافظی استفاده می کند که از
customers
ارائه دهنده کاربر برای احراز هویت درخواست های دریافتی استفاده می کند:
Route::get('/customer', function () { // ...})->middleware('auth:api-customers');
برای اطلاعات بیشتر در مورد استفاده از چندین ارائه دهنده کاربر با پاسپورت، لطفاً به اسناد اعطای رمز عبور مراجعه کنید .
عبور رمز دسترسی
هنگام فراخوانی مسیرهایی که توسط پاسپورت محافظت می شوند، مصرف کنندگان API برنامه شما باید توکن دسترسی خود را به عنوان یک
Bearer
توکن در
Authorization
هدر درخواست خود مشخص کنند. به عنوان مثال، هنگام استفاده از کتابخانه HTTP Guzzle:
use Illuminate\Support\Facades\Http; $response = Http::withHeaders([ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken,])->get('https://passport-app.test/api/user'); return $response->json();
محدوده توکن
Scopes به مشتریان API شما اجازه می دهد هنگام درخواست مجوز برای دسترسی به یک حساب، مجموعه خاصی از مجوزها را درخواست کنند. به عنوان مثال، اگر در حال ساخت یک برنامه تجارت الکترونیک هستید، همه مصرف کنندگان API به توانایی سفارش دادن نیاز نخواهند داشت. درعوض، میتوانید به مصرفکنندگان اجازه دهید فقط برای دسترسی به وضعیت ارسال سفارش مجوز درخواست کنند. به عبارت دیگر، دامنه ها به کاربران برنامه شما اجازه می دهند تا اقداماتی را که یک برنامه شخص ثالث می تواند از طرف آنها انجام دهد محدود کنند.
تعریف محدوده ها
شما می توانید محدوده های API خود را با استفاده از
Passport::tokensCan
روش موجود در
boot
متد کلاس برنامه خود تعریف کنید
App\Providers\AppServiceProvider
. این
tokensCan
روش مجموعهای از نامهای محدوده و توصیفهای محدوده را میپذیرد. شرح محدوده ممکن است هر چیزی باشد که شما بخواهید و در صفحه تایید مجوز برای کاربران نمایش داده می شود:
/** * Bootstrap any application services. */public function boot(): void{ Passport::tokensCan([ 'place-orders' => 'Place orders', 'check-status' => 'Check order status', ]);}
محدوده پیش فرض
اگر یک کلاینت دامنه خاصی را درخواست نمی کند، می توانید سرور پاسپورت خود را پیکربندی کنید تا محدوده(های) پیش فرض را با استفاده از روش به توکن متصل کند
setDefaultScope
. به طور معمول، شما باید این متد را از
boot
متد کلاس برنامه خود فراخوانی کنید
App\Providers\AppServiceProvider
:
use Laravel\Passport\Passport; Passport::tokensCan([ 'place-orders' => 'Place orders', 'check-status' => 'Check order status',]); Passport::setDefaultScope([ 'check-status', 'place-orders',]);
دامنههای پیشفرض پاسپورت برای نشانههای دسترسی شخصی که توسط کاربر تولید میشوند اعمال نمیشود.
اختصاص دامنه به توکن ها
هنگام درخواست کدهای مجوز
هنگام درخواست رمز دسترسی با استفاده از اعطای کد مجوز، مصرف کنندگان باید محدوده مورد نظر خود را به عنوان
scope
پارامتر رشته پرس و جو مشخص کنند. پارامتر
scope
باید فهرستی از محدودهها با فاصله محدود باشد:
Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'code', 'scope' => 'place-orders check-status', ]); return redirect('http://passport-app.test/oauth/authorize?'.$query);});
هنگام صدور توکن های دسترسی شخصی
اگر نشانههای دسترسی شخصی را با استفاده از روش
App\Models\User
مدل صادر میکنید
createToken
، میتوانید آرایه دامنههای مورد نظر را به عنوان آرگومان دوم به متد ارسال کنید:
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
بررسی محدوده ها
پاسپورت شامل دو میانافزار است که ممکن است برای تأیید اعتبار درخواست ورودی با توکنی استفاده شود که محدوده مشخصی به آن داده شده است. برای شروع، نام مستعار میان افزار زیر را در
bootstrap/app.php
فایل برنامه خود تعریف کنید:
use Laravel\Passport\Http\Middleware\CheckForAnyScope;use Laravel\Passport\Http\Middleware\CheckScopes; ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'scopes' => CheckScopes::class, 'scope' => CheckForAnyScope::class, ]);})
همه دامنه ها را بررسی کنید
میانافزار
scopes
ممکن است به مسیری اختصاص داده شود تا تأیید کند که رمز دسترسی درخواست ورودی دارای تمام دامنههای فهرست شده است:
Route::get('/orders', function () { // Access token has both "check-status" and "place-orders" scopes...})->middleware(['auth:api', 'scopes:check-status,place-orders']);
هر محدوده را بررسی کنید
میان
scope
افزار ممکن است به مسیری اختصاص داده شود تا تأیید کند که نشانه دسترسی درخواست ورودی
حداقل یکی
از حوزه های فهرست شده را دارد:
Route::get('/orders', function () { // Access token has either "check-status" or "place-orders" scope...})->middleware(['auth:api', 'scope:check-status,place-orders']);
بررسی دامنه ها در یک نمونه توکن
tokenCan
هنگامی که یک درخواست احراز هویت توکن دسترسی وارد برنامه شما شد، همچنان میتوانید با استفاده از روش موجود در
App\Models\User
نمونه احراز هویت شده
، بررسی کنید که آیا توکن دارای محدوده مشخصی است :
use Illuminate\Http\Request; Route::get('/orders', function (Request $request) { if ($request->user()->tokenCan('place-orders')) { // ... }});
روش های دامنه اضافی
متد
scopeIds
آرایه ای از همه شناسه ها / نام های تعریف شده را برمی گرداند:
use Laravel\Passport\Passport; Passport::scopeIds();
متد
scopes
آرایه ای از تمام محدوده های تعریف شده را به عنوان نمونه های زیر برمی گرداند
Laravel\Passport\Scope
:
Passport::scopes();
این
scopesFor
روش آرایهای از
Laravel\Passport\Scope
نمونههای مطابق با شناسهها/نامهای داده شده را برمیگرداند:
Passport::scopesFor(['place-orders', 'check-status']);
شما می توانید تعیین کنید که آیا یک محدوده معین با استفاده از روش تعریف شده است
hasScope
:
Passport::hasScope('place-orders');
مصرف API خود با جاوا اسکریپت
هنگام ساختن یک API، این می تواند بسیار مفید باشد که بتوانید API خود را از برنامه جاوا اسکریپت خود مصرف کنید. این رویکرد برای توسعه API به برنامه کاربردی شما اجازه میدهد تا همان API را که با جهان به اشتراک میگذارید، مصرف کند. همان API ممکن است توسط برنامه های کاربردی وب، برنامه های تلفن همراه، برنامه های شخص ثالث و هر SDK که ممکن است در مدیران بسته های مختلف منتشر کنید مصرف شود.
به طور معمول، اگر می خواهید API خود را از برنامه جاوا اسکریپت خود مصرف کنید، باید به صورت دستی یک نشانه دسترسی به برنامه ارسال کنید و آن را با هر درخواست به برنامه خود ارسال کنید. با این حال، Passport شامل یک میان افزار است که می تواند این کار را برای شما انجام دهد. تنها کاری که باید انجام دهید این است که
CreateFreshApiToken
میان افزار را به
web
گروه میان افزار در فایل برنامه خود اضافه کنید
bootstrap/app.php
:
use Laravel\Passport\Http\Middleware\CreateFreshApiToken; ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ CreateFreshApiToken::class, ]);})
باید اطمینان حاصل کنید که
CreateFreshApiToken
میان افزار آخرین میان افزار لیست شده در پشته میان افزار شما باشد.
این میان افزار یک
laravel_token
کوکی به پاسخ های خروجی شما متصل می کند. این کوکی حاوی یک JWT رمزگذاری شده است که پاسپورت از آن برای احراز هویت درخواست های API از برنامه جاوا اسکریپت شما استفاده می کند. طول عمر JWT برابر با
session.lifetime
مقدار پیکربندی شما است. اکنون، از آنجایی که مرورگر بهطور خودکار کوکی را با تمام درخواستهای بعدی ارسال میکند، میتوانید درخواستهایی را به API برنامه خود بدون ارسال صریح یک نشانه دسترسی ارسال کنید:
axios.get('/api/user') .then(response => { console.log(response.data); });
سفارشی کردن نام کوکی
در صورت نیاز، می توانید
laravel_token
نام کوکی را با استفاده از
Passport::cookie
روش سفارشی کنید. به طور معمول، این متد باید از
boot
متد کلاس برنامه شما
فراخوانی شود
App\Providers\AppServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ Passport::cookie('custom_name');}
حفاظت CSRF
هنگام استفاده از این روش احراز هویت، باید اطمینان حاصل کنید که یک هدر توکن معتبر CSRF در درخواستهای شما گنجانده شده است. داربست پیشفرض جاوا اسکریپت لاراول شامل یک نمونه Axios است که بهطور خودکار از
XSRF-TOKEN
مقدار کوکی رمزگذاریشده برای ارسال
X-XSRF-TOKEN
هدر در درخواستهای با منبع مشابه استفاده میکند.
X-CSRF-TOKEN
اگر بجای ارسال هدر انتخاب کنیدX-XSRF-TOKEN
، باید از رمز رمزگذاری نشده ارائه شده توسط استفاده کنیدcsrf_token()
.
مناسبت ها
پاسپورت رویدادها را هنگام صدور توکن های دسترسی و رفرش توکن ها افزایش می دهد. میتوانید به این رویدادها گوش دهید تا سایر نشانههای دسترسی را در پایگاه داده خود حذف یا لغو کنید:
نام رخداد |
---|
Laravel\Passport\Events\AccessTokenCreated |
Laravel\Passport\Events\RefreshTokenCreated |
آزمایش کردن
روش پاسپورت
actingAs
ممکن است برای مشخص کردن کاربر تأیید شده فعلی و همچنین محدوده آن استفاده شود. اولین آرگومان داده شده به
actingAs
متد، نمونه کاربر است و دومی آرایه ای از دامنه است که باید به توکن کاربر اعطا شود:
use App\Models\User;use Laravel\Passport\Passport; test('servers can be created', function () { Passport::actingAs( User::factory()->create(), ['create-servers'] ); $response = $this->post('/api/create-server'); $response->assertStatus(201);});
use App\Models\User;use Laravel\Passport\Passport; public function test_servers_can_be_created(): void{ Passport::actingAs( User::factory()->create(), ['create-servers'] ); $response = $this->post('/api/create-server'); $response->assertStatus(201);}
روش پاسپورت
actingAsClient
ممکن است برای مشخص کردن مشتری تأیید شده فعلی و همچنین محدوده آن استفاده شود. اولین آرگومان ارائه شده به
actingAsClient
متد، نمونه مشتری است و دومی آرایه ای از دامنه است که باید به توکن مشتری اعطا شود:
use Laravel\Passport\Client;use Laravel\Passport\Passport; test('orders can be retrieved', function () { Passport::actingAsClient( Client::factory()->create(), ['check-status'] ); $response = $this->get('/api/orders'); $response->assertStatus(200);});
use Laravel\Passport\Client;use Laravel\Passport\Passport; public function test_orders_can_be_retrieved(): void{ Passport::actingAsClient( Client::factory()->create(), ['check-status'] ); $response = $this->get('/api/orders'); $response->assertStatus(200);}