كما لاحظنا من خلال دروس RESTful API السابقة، أن أي شخص يستخدم رابط api يتم عرض النتائج له بشكل مباشرة، لكن ببعض الأحيان قد نرغب بإضافة طبقة حماية لحماية routes يمعنى أنه يجب أن نتحقق أنه يحق للشخص إستخدام الـ api، ومن أحد الطرق التي يمكن إستخدامها أن يتم إرسال كلمة مرور وإسم مستخدم مع كل رابط api يتم إستخدامة.
إنشاء middleware مثلا باسم ProtectApiWithPassword.
php artisan make:middleware ProtectApiWithPassword
من خلال تنفيذ أمر artisan أعلاه سيتم إنشاء middleware جديد باسم ProtectApiWithPassword
class ProtectApiWithPassword { public function handle(Request $request, Closure $next) { return $next($request); } }
نحتاج الأن لكتابة منطق العمل لهذا الـ middleware
public function handle(Request $request, Closure $next) { if($request->api_password !== env('API_PASSWORD','ethar_password')){ return \response()->json(['message'=>'UnAuthenticated']); } return $next($request); }
حيث إنه في كل رابط يجب إرسال باراميتر باسم api_password ويجب أن تساوي قيمة API_PASSWORD التي سيتم تعريفها في ملف .env أما إذا لم تكن معرفة فإنه يجب أن تكون قيمتها تساوي ether_password.
تعريف قيمة API_PASSWORD في ملف .env
API_PASSWORD=ethar_password
في داخل المصفوفة routeMiddleware يتم تسجيل middleware
'ProtectApiWithPassword' => \App\Http\Middleware\ProtectApiWithPassword::class,
Route::group(['middleware'=>['ProtectApiWithPassword']],function() { Route::apiResource('brands', BrandController::class); });
الأن لو قمنا بزيارة الرابط
http://www.test.test/api/v1/brands
فإننا سوف نحصل على رسالة خطأ
{ "message": "UnAuthenticated" }
وذلك لأنه في ProtectApiWithPassword قمنا بإخبارة أنه يجب إرسال parameter بإسم api_password وتكون قيمته تساوي ethar_password، حيث إنه يجب إرسال باراميتر api_password مع كل رابط
الأن لو تم زيارة الرابط
http://www.test.test/api/v1/brands?api_password=ethar_password
فإننا سوف نحصل على البيانات