كيف اسمح للAPI فقط للحصول على المعلومات او ارسال المعلومات, و منع المستخدم من الدخول بالمتصفح فقط يستطيع ارسال او استقبال البيانات من API الخاص بالموقع؟
السماح لل API فقط Laravel
سأشرح لك الفكرة أولًا، ثم الطرق العملية.
الفكرة الأساسية
لا يمكنك تقنيًا “منع المتصفح تمامًا” من الوصول للـ 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:
مفتوح شكليًا، مغلق فعليًا.
التعليقات