كيف اسمح للAPI فقط للحصول على المعلومات او ارسال المعلومات, و منع المستخدم من الدخول بالمتصفح فقط يستطيع ارسال او استقبال البيانات من API الخاص بالموقع؟
السماح لل API فقط Laravel
الأفضل إجبار الطلبات على أن تكون من نوع JSON، لأنّ المتصفحات بشكل افتراضي تطلب محتوى HTML عند الدخول إلى رابط، بينما تطبيقات الموبايل أو المواقع الأخرى التي تتصل بالـ API ترسل ترويسة Header تسمى Accept: application/json
لذا تستطيع منع الدخول المباشر عبر المتصفح من خلال إنشاء Middleware يتحقق من وجود تلك الترويسة.
php artisan make:middleware ForceJsonResponse
ثم اذهب إلى الملف الذي تم إنشاؤه في app/Http/Middleware/ForceJsonResponse.php وقم بتعديل دالة handle لتصبح كالتالي:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class ForceJsonResponse
{
public function handle(Request $request, Closure $next): Response
{
if (!$request->wantsJson()) {
return response()->json([
'status' => false,
'message' => 'Access denied. Only API requests are allowed.'
], 406); // 406 Not Acceptable
}
return $next($request);
}
}
وبدءًا من لارافل 11 وأعلى افتح ملف bootstrap/app.php وأضف الـ Middleware إلى قسم الـ API لتفعيله:
use App\Http\Middleware\ForceJsonResponse;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->api(prepend: [
ForceJsonResponse::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
وما سبق ليس كافٍ، فمن لديه خبرة بالبرمجة يستطيع تعديل الترويسات وتخطي الـ middleware، لذا ستحتاج إلى استخدام Laravel Sanctum.
بحيث يكون أي مسار داخل routes/api.php محمي بواسطة auth:sanctum أي من خلال Token، وإليك مثال لحماية مسار user
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
وبذلك حتى لو قام الشخص بوضع Accept: application/json، ولم يرسل Authorization: Bearer {TOKEN}، سيرفض لارافل الطلب.
التعليقات