السماح لل API فقط Laravel

كيف اسمح للAPI فقط للحصول على المعلومات او ارسال المعلومات, و منع المستخدم من الدخول بالمتصفح فقط يستطيع ارسال او استقبال البيانات من API الخاص بالموقع؟


سأشرح لك الفكرة أولًا، ثم الطرق العملية.

الفكرة الأساسية

لا يمكنك تقنيًا “منع المتصفح تمامًا” من الوصول للـ API،

لأن أي طلب API هو في النهاية طلب HTTP ويمكن تنفيذه من المتصفح أو أي أداة أخرى.

لكن ما يمكنك فعله هو:

جعل الـ API لا يستجيب إلا لطلبات صحيحة ومصرّح بها

وأي محاولة فتح الرابط مباشرة في المتصفح تكون عديمة الفائدة.

1. التحقق من الهوية (Authentication)

أهم خطوة.

استخدم:

  • JWT
  • Session + Cookies
  • API Keys (لخدمات داخلية فقط)

الفكرة:

أي endpoint حساس:

GET /api/profile

لا يُرجع شيئًا إلا إذا أُرسل معه Token صالح.

مثال:

Authorization: Bearer <JWT_TOKEN>

بدون التوكن:

  • يرجع 401 Unauthorized
  • حتى لو فتحه المستخدم من المتصفح

2. تحديد من يُسمح له بالوصول (Authorization)

ليس كل مستخدم له نفس الصلاحيات.

مثال:

  • مستخدم عادي
  • طبيب
  • Admin

تتحقق داخل السيرفر:

if (user.role !== 'admin') {
  return res.status(403).json({ error: 'Forbidden' })
}

3. تقييد CORS (مهم جدًا)

CORS لا يمنع الهجمات، لكنه يمنع الاستخدام غير الشرعي من المتصفحات.

في Express:

app.use(cors({
  origin: 'https://your-frontend.com',
  credentials: true
}))

هذا يسمح فقط لواجهة موقعك بالوصول للـ API من المتصفح.

4. منع عرض البيانات عند الطلب المباشر

لا تُرجع HTML أبدًا.

الـ API يجب أن يُرجع:

  • JSON فقط
  • Status Codes واضحة

مثال:

res.json({ data })

وعند فتح الرابط مباشرة:

سيظهر JSON بلا معنى للمستخدم العادي.

5. استخدام Middleware للحماية

مثال:

function authMiddleware(req, res, next) {
  const token = req.headers.authorization
  if (!token) return res.status(401).json({ error: 'Unauthorized' })
  next()
}

app.get('/api/profile', authMiddleware, controller)

6. Rate Limiting

لمنع:

  • التجريب العشوائي
  • Brute Force
  • Scraping
import rateLimit from 'express-rate-limit'

app.use('/api', rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100
}))

7. حماية متقدمة (اختياري)

  • HTTPS فقط
  • CSRF Token (إن كنت تستخدم Cookies)
  • Validation لكل Input
  • عدم كشف رسائل الخطأ التفصيلية

الحقيقة المهمة

لا تحاول منع:

http://example.com/api/users

من الفتح في المتصفح

بل اجعل:

  • فتحه بلا توكن = لا قيمة له
  • فتحه بدون صلاحية = مرفوض
  • أي طلب غير شرعي = مرفوض

وهكذا يصبح الـ API:

مفتوح شكليًا، مغلق فعليًا.