API Authentication
معرفی
به طور پیش فرض، لاراول با یک راه حل ساده برای احراز هویت API از طریق یک توکن تصادفی اختصاص داده شده به هر کاربر از برنامه شما ارسال می شود. در
config/auth.php
فایل پیکربندی
شما ، یک
api
محافظ از قبل تعریف شده است و از یک
token
درایور استفاده می کند. این درایور مسئول بازرسی توکن API در درخواست ورودی و بررسی مطابقت آن با توکن اختصاص داده شده کاربر در پایگاه داده است.
توجه: در حالی که لاراول با یک محافظ ساده و مبتنی بر توکن عرضه می شود، ما قویاً توصیه می کنیم از Laravel Passport برای برنامه های قوی و تولیدی استفاده کنید که احراز هویت API را ارائه می دهند.
پیکربندی
آماده سازی پایگاه داده
قبل از استفاده از
token
درایور، باید
یک مهاجرت ایجاد کنید
که یک
api_token
ستون به
users
جدول شما اضافه می کند:
Schema::table('users', function ($table) { $table->string('api_token', 80)->after('password') ->unique() ->nullable() ->default(null);});
پس از ایجاد مهاجرت،
migrate
دستور Artisan را اجرا کنید.
اگر انتخاب می کنید از نام ستون دیگری استفاده کنید، حتماً
storage_key
گزینه پیکربندی API خود را درconfig/auth.php
فایل پیکربندی به روز کنید.
تولید توکن
هنگامی که
api_token
ستون به جدول شما اضافه شد
users
، شما آماده هستید تا به هر کاربری که در برنامه شما ثبت نام می کند، نشانه های API تصادفی اختصاص دهید. زمانی که یک
User
مدل برای کاربر در حین ثبت نام ایجاد می شود،
باید این نشانه ها را اختصاص دهید .
هنگام استفاده از
داربست احراز هویت
ارائه شده توسط بسته Composer، این ممکن است به
روش زیر
laravel/ui
انجام شود
:
create
RegisterController
use Illuminate\Support\Facades\Hash;use Illuminate\Support\Str; /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */protected function create(array $data){ return User::forceCreate([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'api_token' => Str::random(80), ]);}
هش کردن توکن ها
در مثال های بالا، توکن های API در پایگاه داده شما به صورت متن ساده ذخیره می شوند. اگر میخواهید توکنهای API خود را با استفاده از هش SHA-256 هش کنید، میتوانید گزینه
پیکربندی محافظ
hash
خود را روی
. گارد در
فایل پیکربندی
شما تعریف شده است :
api
true
api
config/auth.php
'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => true,],
تولید توکن های هش شده
هنگام استفاده از نشانه های API هش شده، نباید توکن های API خود را در طول ثبت نام کاربر ایجاد کنید. در عوض، باید صفحه مدیریت توکن API خود را در برنامه خود پیاده سازی کنید. این صفحه باید به کاربران اجازه دهد تا توکن API خود را مقداردهی اولیه و بازخوانی کنند. هنگامی که کاربر درخواستی برای مقداردهی اولیه یا تازه کردن توکن خود می کند، باید یک کپی هش شده از توکن را در پایگاه داده ذخیره کنید و کپی متن ساده توکن را برای نمایش یک بار به مشتری view / frontend برگردانید.
به عنوان مثال، یک متد کنترلکننده که توکن را برای یک کاربر خاص مقداردهی اولیه یا تازه میکند و نشانه متن ساده را به عنوان پاسخ JSON برمیگرداند، ممکن است به شکل زیر باشد:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request;use Illuminate\Support\Str; class ApiTokenController extends Controller{ /** * Update the authenticated user's API token. * * @param \Illuminate\Http\Request $request * @return array */ public function update(Request $request) { $token = Str::random(80); $request->user()->forceFill([ 'api_token' => hash('sha256', $token), ])->save(); return ['token' => $token]; }}
از آنجایی که توکن های API در مثال بالا دارای آنتروپی کافی هستند، ایجاد "جدول رنگین کمان" برای جستجوی مقدار اصلی توکن هش شده غیرعملی است. بنابراین، روش های هش آهسته مانند
bcrypt
غیر ضروری هستند.
حفاظت از مسیرها
لاراول شامل یک
محافظ احراز هویت
است که به طور خودکار توکن های API را در درخواست های دریافتی تأیید می کند. شما فقط باید
auth:api
میان افزار را در هر مسیری که به یک نشانه دسترسی معتبر نیاز دارد، مشخص کنید:
use Illuminate\Http\Request; Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user();});
عبور توکن ها در درخواست ها
راه های مختلفی برای انتقال توکن API به برنامه شما وجود دارد. ما در مورد هر یک از این رویکردها در حین استفاده از کتابخانه HTTP Guzzle برای نشان دادن استفاده از آنها بحث خواهیم کرد. شما می توانید هر یک از این رویکردها را بر اساس نیازهای برنامه خود انتخاب کنید.
رشته پرس و جو
مصرف کنندگان API برنامه شما ممکن است توکن خود را به عنوان یک
api_token
مقدار رشته کوئری مشخص کنند:
$response = $client->request('GET', '/api/user?api_token='.$token);
بارگذاری را درخواست کنید
مصرف کنندگان API برنامه شما ممکن است نشانه API خود را در پارامترهای فرم درخواست به صورت
api_token
:
$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', ], 'form_params' => [ 'api_token' => $token, ],]);
توکن حامل
مصرف کنندگان API برنامه شما ممکن است نشانه API خود را به عنوان یک
Bearer
توکن در
Authorization
هدر درخواست ارائه دهند:
$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Authorization' => 'Bearer '.$token, 'Accept' => 'application/json', ],]);