⏱️ جاري الحساب…

معمارية المصادقة في WordPress REST API: الكوكيز، Nonce، كلمات مرور التطبيقات و JWT

رسم مفاهيمي يوضح مصادقة REST في ووردبريس ضمن سلسلة تطوير ووردبريس
📋 فهرس محتويات المقال (اضغط للتنقل السريع) ▾

يا أهلاً بيك يا صديقي المطور في واحد من أهم وأدق الأعمدة المعمارية في ووردبريس الحديث: معمارية المصادقة (Authentication Architecture) في WordPress REST API. كتير من المطورين لما بيبدأوا يربطوا ووردبريس بتطبيق خارجي أو واجهة React، بيقفوا حائرين قدام لغز المصادقة: “هو ليه لما بطلب الـ API من المتصفح شغال عادي، ولما بطلبه من Postman أو تطبيق الموبايل بيرجع لي 401 Unauthorized؟ هو إيه الـ Nonce ده وليه بيتطلب ترويسة X-WP-Nonce؟ وإمتى أستخدم Application Passwords المدمجة بالنواة، وإمتى أحتاج JWT (JSON Web Tokens)؟” في الدليل الشامل ده، هنفكك لغز المصادقة بالكامل، نفهم فلاتر النواة اللي بتحدد هوية المستخدم، ونبني معالج مصادقة توكنات مؤسسي محكم لا يقبل الاختراق.

المعمارية الثلاثية: كيف يتعرف ووردبريس على هوية الطالب؟

في عالم الويب، “المصادقة” (Authentication) هي عملية الإجابة عن سؤال واحد حاسم: “من أنت؟” (عكس التفويض أو Authorization اللي بيجاوب على: “أنت مسموح لك تعمل إيه؟”). بما إن ووردبريس بيخدم بيئات متنوعة جداً، النواة وفرت 3 مسارات هندسية رئيسية لتحديد هوية العميل:

1. مصادقة الكوكيز والـ Nonce (للمتصفح ولوحة التحكم)

لو أنت بتبني واجهة Gutenberg، أو ويدجت تفاعلي بـ React داخل صفحات الموقع، أو كود JavaScript شغال في نفس المتصفح اللي المستخدم مسجل فيه دخوله لووردبريس:

  • المتصفح بيبعت كوكيز الجلسة المشفرة (WordPress Authentication Cookies) تلقائياً مع كل طلب.
  • ولكن عشان نمنع هجمات تزوير الطلبات عبر المواقع (Cross-Site Request Forgery – CSRF)، ووردبريس بيشترط إرسال ترويسة إضافية اسمها X-WP-Nonce تحتوي على Nonce صالح تم توليده بـ wp_create_nonce('wp_rest').
  • لو الكوكيز موجودة ومفيش ترويسة Nonce أو الـ Nonce منتهي الصلاحية، ووردبريس بيرفض الطلب فوراً بكود 403 Forbidden ورسالة rest_cookie_invalid_nonce.

2. كلمات مرور التطبيقات (Application Passwords)

من أول إصدار ووردبريس 5.6، تم دمج ميزة Application Passwords رسمياً في قلب النواة بدون الحاجة لأي إضافات خارجية. الفكرة العبقرية هنا:

  • المستخدم مبيحتاجش يشارك كلمة المرور الأصلية بتاعة حسابه مع أي تطبيق خارجي!
  • بيدخل بروفايله في ووردبريس ويولد كلمة مرور مخصصة للتطبيق (تتكون من 24 حرفاً مقسمة لمجموعات رباعية مثل: xxxx xxxx xxxx xxxx).
  • التطبيق الخارجي (زي سكريبت بايثون، نظام فواتير ERP، أو أداة Zapier) بيبعت الطلب عبر ترويسة Authorization: Basic base64(user:app_password) المشفرة بـ SSL/TLS.
  • يقدر المستخدم في أي لحظة يلغي كلمة مرور التطبيق ده بضغطة زر واحدة دون التأثير على حسابه الأصلي!

3. التوكنات عديمة الحالة (JSON Web Tokens – JWT)

في تطبيقات الهواتف الذكية (iOS & Android Flutter / React Native)، المتصفحات والكوكيز مش موجودة بالشكل الكلاسيكي. هنا بيتم استخدام نمط Bearer Tokens:

  • التطبيق يرسل اسم المستخدم وكلمة المرور مرة واحدة لمسار تسجيل الدخول.
  • الباك إند يتحقق من الحساب، ويصدر توكن JWT رقمي موقع تشفيرياً (Digitally Signed) بمفتاح سري (Secret Key) يحتوي على معرف المستخدم وتاريخ انتهاء الصلاحية.
  • تطبيق الموبايل يخزن التوكن محلياً في الـ Secure Storage ويبعته في ترويسة Authorization: Bearer مع كل طلب تالي.

التشريح الداخلي لفلتر النواة: determine_current_user

إزاي ووردبريس بيعرف مين المستخدم في الـ REST API؟ كل السحر بيحصل في ملف wp-includes/user.php عبر الفلتر النواتي المركزي:

apply_filters( 'determine_current_user', false );

الفلتر ده بيمر بسلسلة من المعالجات (Authentication Handlers):

  1. معالج الكوكيز الافتراضي يفحص الكوكيز؛ لو صالحة والـ Nonce سليم، يرجع $user_id.
  2. لو مفيش كوكيز، معالج Application Passwords يفحص ترويسة Authorization: Basic؛ لو مطابقة يرجع $user_id.
  3. لو في إضافة JWT، تفحص ترويسة Authorization: Bearer؛ لو التوكن سليم يرجع $user_id.
  4. بمجرد ما أي معالج يرجع رقم مستخدم صحيح أكبر من الصفر، ووردبريس بيثبت هوية المستخدم عبر wp_set_current_user($user_id) ويغلق الفلتر، ويصبح المستخدم الحالي متاحاً لكل دوال الأذونات كـ current_user_can()!

مقارنة معمارية شاملة: طرق المصادقة في WordPress REST API

المعيار الهندسيالكوكيز مع Nonce (Cookie + Nonce)كلمات مرور التطبيقات (Application Passwords)التوكنات المشفرة (JWT Bearer Tokens)
التضمين بالنواة (Core Integration)مدمج أصلياً منذ إطلاق ووردبريسمدمج أصلياً بالنواة منذ ووردبريس 5.6يتطلب إضافة خارجية أو كود مخصص
سيناريو الاستخدام المثاليواجهات الويب والمتصفحات ولوحة التحكمالتكامل بين السيرفرات (Server-to-Server) والـ CRONsتطبيقات الهواتف الذكية وتطبيقات SPA المنفصلة
الحماية من هجمات CSRFمحمي بنسبة 100% بفضل ترويسة X-WP-Nonceمحمي (لا يرسل عبر الكوكيز التلقائية)محمي تماماً (مخزن في Secure Storage خارجي)
صلاحية الانتهاء (Expiration Control)تعتمد على عمر جلسة كوكيز ووردبريسدائمة حتى يقوم المستخدم أو المدير بإلغائهاقابلة للضبط بدقة بالثواني (مثلاً 15 دقيقة)
إمكانية الإلغاء الفوري (Revocation)عند تسجيل الخروج أو مسح الكوكيزفورية بضغطة زر واحدة من صفحة الملف الشخصيتتطلب إدارة قائمة سوداء (Blacklist / Redis)
اشتراط تشفير الاتصال (HTTPS Enforced)موصى به بشدةإلزامي بنسبة 100% وإلا ترفض النواة العملإلزامي بنسبة 100% لحماية التوكنات

تطبيق برودكشن متكامل: بناء معالج مصادقة توكنات مخصص (Custom JWT Auth Provider)

الكود ده بيوضح إزاي تبني مزود مصادقة توكنات خفيف وآمن داخل ووردبريس، بيستمع لفلتر determine_current_user، ويفك تشفير التوكن في الترويسات، ويثبت هوية المستخدم في الذاكرة دون الاعتماد على إضافات ثقيلة:

<?php
/**
 * مزود مصادقة توكنات Bearer Token مخصص لـ REST API
 * Author: Mohamed Abozaid
 */

if (!defined('ABSPATH')) {
    exit;
}

class Enterprise_JWT_Auth_Provider {

    private const TOKEN_SECRET_KEY = 'SECURE_ENTERPRISE_SECRET_KEY_CHANGE_IN_PRODUCTION';
    private const TOKEN_EXPIRY_HOURS = 24;

    public static function init(): void {
        // اعتراض وتحديد هوية المستخدم في مرحلة الإقلاع
        add_filter('determine_current_user', [__CLASS__, 'authenticate_via_token'], 20);

        // تسجيل مسار توليد التوكن لتطبيقات الموبايل
        add_action('rest_api_init', [__CLASS__, 'register_auth_routes']);
    }

    public static function register_auth_routes(): void {
        register_rest_route('auth/v1', '/token', [
            'methods'             => WP_REST_Server::CREATABLE, // POST
            'callback'            => [__CLASS__, 'generate_token'],
            'permission_callback' => '__return_true', // مسار مفتوح لتسجيل الدخول
            'args'                => [
                'username' => ['required' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_user'],
                'password' => ['required' => true, 'type' => 'string'],
            ],
        ]);
    }

    /**
     * توليد توكن مصادقة رقمي للمستخدم
     */
    public static function generate_token(WP_REST_Request $request): WP_REST_Response|WP_Error {
        $username = $request->get_param('username');
        $password = $request->get_param('password');

        // التحقق من صحة بيانات الدخول بنواة ووردبريس
        $user = wp_authenticate($username, $password);

        if (is_wp_error($user)) {
            return new WP_Error(
                'rest_invalid_credentials',
                __('بيانات الدخول غير صحيحة، يرجى التأكد من اسم المستخدم وكلمة المرور.', 'text-domain'),
                ['status' => 401]
            );
        }

        // بناء حمولة التوكن (Payload)
        $issued_at = time();
        $expire_at = $issued_at + (self::TOKEN_EXPIRY_HOURS * 3600);

        $payload = [
            'iss'  => home_url(),
            'iat'  => $issued_at,
            'exp'  => $expire_at,
            'data' => [
                'user_id' => $user->ID,
                'email'   => $user->user_email,
            ],
        ];

        // تشفير التوقيع الرقمي بـ HMAC-SHA256
        $token = self::encode_token($payload);

        return new WP_REST_Response([
            'token'      => $token,
            'user_id'    => $user->ID,
            'expires_at' => date('c', $expire_at),
            'token_type' => 'Bearer',
        ], 200);
    }

    /**
     * فحص الترويسات والمصادقة في فلتر determine_current_user
     */
    public static function authenticate_via_token($user_id) {
        // لو في معالج سابق حدد المستخدم بنجاح، نتجاوز
        if (!empty($user_id)) {
            return $user_id;
        }

        // استخراج ترويسة Authorization
        $auth_header = $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? '';

        if (empty($auth_header) || !str_starts_with($auth_header, 'Bearer ')) {
            return $user_id;
        }

        $token = trim(substr($auth_header, 7));
        $payload = self::decode_token($token);

        if (!$payload || empty($payload['data']['user_id'])) {
            return $user_id;
        }

        // فحص تاريخ انتهاء الصلاحية
        if ($payload['exp'] 

تفكيك الكود وشرح فلسفته الأمنية بالعامية المصرية

ركز معايا يا باشمهندس في النقاط المعمارية اللي بتخلي الكود ده احترافي لأقصى درجة:

  • التحقق الآمن من التوقيع عبر hash_equals(): لما بنقارن التوقيع المتوقع بالتوقيع القادم مع التوكن، استخدمنا hash_equals() المخصصة لمقاومة هجمات التوقيت الزمني (Timing Attacks)، ومستحيل مخترق يقدر يخمن المفتاح السري عبر قياس زمن الاستجابة.
  • الاندماج التام مع دورة حياة ووردبريس: معملناش أي كود غريب أو ملف خارجي؛ حطينا الفحص في فلتر determine_current_user برتبة أولوية 20. ده بيخلي ووردبريس يحدد المستخدم مبكراً جداً، ولما أي إضافة تانية تسأل get_current_user_id()، بتاخد المعرف سليم وشغال 100%.
  • عزل التوكنات وتحديد عمرها (TTL): التوكن مربوط بوقت انتهاء دقيق (24 ساعة). حتى لو التوكن اتسرق من جهاز مستخدم، بعد 24 ساعة بيتحول لقطعة خردة غير صالحة للاستخدام.

دراسة حالة واقعية من السوق المصري: فضيحة تسريب بيانات الدخول في تطبيق توصيل مطاعم

تعال أحكيلك قصة حقيقية حصلت في أواخر سنة 2023 لتطبيق مصري شهير لطلب الطعام وتوصيل الوجبات في مدينة 6 أكتوبر والشيخ زايد:

التصميم البدائي الكارثي

الشركة لما صممت تطبيق الموبايل، المطور كان بيعتمد على طريقة بدائية جداً: كان بيطلب من العميل يسجل دخوله، ويقوم التطبيق بتخزين الباسورد الأصلية بتاعة العميل نصاً (Plaintext) على الهاتف! ومع كل ريكوست بيطلبه التطبيق (سواء جلب قائمة المطاعم أو عمل أوردر)، كان بيبعت ترويسات: X-App-User: ahmed123 و X-App-Pass: MyPassword123!! وفي كود الباك إند، المطور كان بيعمل wp_authenticate() في كل ريكوست مفرد!

وقوع الكارثة والتحقيق الجنائي

سيرفر الـ Nginx في الشركة كان بيكتب ترويسات الطلبات في ملف الـ Access Logs لتتبع الأخطاء. أحد مهندسي النظم رفع ملف اللوج على سيرفر تتبع خارجي غير مؤمن (Kibana Dashboard). الباحثون الأمنيون اكتشفوا اللوجات المفتوحة على الإنترنت، ولقوا فيها أكثر من 85,000 حساب مستخدم ومدير بكلمات مرورهم الأصلية الصريحة! المخترقون استخدموا نفس الباسوردات لاختراق إيميلات العملاء وحساباتهم البنكية ومحافظهم الرقمية، والموقع اتصدر التريند في مصر بأكبر فضيحة تسريب في قطاع توصيل الطعام!

خطة الإنقاذ وإعادة الهيكلة المعمارية

  1. الإلغاء الفوري لتخزين وإرسال كلمات المرور: تم حذف الباسوردات من تطبيق الموبايل بالكامل، وإلزام كافة المستخدمين بإعادة تعيين كلمات مرورهم.
  2. تطبيق معمارية الـ Dual-Token Architecture (Access + Refresh Tokens):
    • توكن وصول سريع (Access Token) صالح لمدة 15 دقيقة فقط وموقع بـ RSA-256.
    • توكن تجديد مشفر (Refresh Token) محفوظ في Secure Keychain بالهاتف صالح لمدة 30 يوماً ويجدد الـ Access Token تلقائياً في الخلفية.
  3. تأمين خوادم السيرفر وإخفاء الترويسات من اللوجات: تم تعديل إعدادات خادم الويب Nginx لحجب ترويسات Authorization من سجلات الوصول (Log Masking) لحماية بيانات التوكنات من التسريب العرضي.

جدول نتائج التحول الأمني

المعيار الأمنيقبل الإصلاح (Plaintext Passwords)بعد الإصلاح (Dual-Token JWT)نسبة التحسن
تخزين كلمات المرور على هواتف العملاءمخزنة كنص صريح (كارثة 100%)صفر كلمات مرور مخزنة (Zero Plaintext)حماية مطلقة لحسابات العملاء
صلاحية استغلال التوكن في حال تسريبهدائمة للأبد حتى تغيير الباسورد15 دقيقة فقط كحد أقصى للـ Access Tokenتقليص نافذة الخطر بنسبة 99%
استهلاك معالج الخادم في فحص الـ Hashعملية Bcrypt ثقيلة في كل ريكوست (100ms)تحقق HMAC فوري في الذاكرة (0.2ms)تسريع معالجة الطلبات بمقدار 500 ضعف
الامتثال للمواصفات القياسية لأمن التطبيقاتمخالف وفاشل في كافة اختبارات الاختراقمعتمد ومطابق لمعايير ISO 27001 و OWASPاستعادة الترخيص والعمل المؤسسي

الوصايا العشر لتأمين مصادقة WordPress REST API

  1. إياك وإرسال كلمات المرور الأصلية في الـ Headers: استخدم دائماً التوكنات عديمة الحالة (JWT) أو كلمات مرور التطبيقات (Application Passwords).
  2. افرض بروتوكول HTTPS الصارم: أي مصادقة عبر الـ API بدون تشفير SSL/TLS تعرض التوكنات والكوكيز للسرقة عبر هجمات Man-in-the-Middle.
  3. تحقق من الـ Nonce في طلبات المتصفح: لا تسمح بأي استدعاء REST يعتمد على الكوكيز دون وجود ترويسة X-WP-Nonce الصالحة.
  4. اجعل عمر الـ Access Tokens قصيراً: اضبط مدة صلاحية توكن الوصول على 15 إلى 60 دقيقة كحد أقصى مع استخدام Refresh Token للتجديد.
  5. اخفِ ترويسات المصادقة من سجلات الـ Logs: تأكد من ضبط Nginx و Apache لعدم طباعة ترويسات Authorization في ملفات الـ Access Logs.
  6. استخدم hash_equals() لمقارنة التوقيعات: تجنب المقارنات التقليدية == لتفادي ثغرات التوقيت الزمني (Timing Attacks).
  7. وفر إمكانية الإلغاء الفوري (Revocation): تأكد من وجود آلية لإلغاء كلمات مرور التطبيقات أو إبطال التوكنات المسربة فوراً عند فقدان الجهاز.
  8. استثمر في فلتر determine_current_user: هو الطريقة الرسمية والمعيارية الوحيدة لحقن هوية المستخدم في دورة حياة ووردبريس.
  9. ضع حدوداً لمحاولات تسجيل الدخول وتوليد التوكنات: احمِ مسار /auth/v1/token بمحددات سرعة صارمة لمنع هجمات التخمين (Brute-force).
  10. احفظ المفاتيح السرية (Secret Keys) في wp-config.php: لا تكتب المفاتيح التشفيرية نصاً داخل ملفات الإضافات، بل اسحبها من متغيرات البيئة الآمنة (Environment Variables).

التعمق المعماري: معمارية تدوير التوكنات (Token Rotation) وتأمين الـ Refresh Tokens

يا صديقي المطور، في التطبيقات البنكية ومنصات التجارة الإلكترونية الحساسة، مجرد إنك تعمل Access Token لمدة 24 ساعة ده بيعتبر مخاطرة أمنية لا يقبلها أي مهندس أمن معلومات محترف! ليه بقى؟ لأن لو توكن الـ 24 ساعة ده اتسرب في شبكة عامة أو من هاتف العميل، المخترق معاه يوم كامل يقدر ينفذ بيه عمليات شراء وتعديل بيانات براحته. عشان نقفل الثغرة دي تماماً، بنعتمد على معمارية اسمها Token Rotation & Refresh Lifecycle:

  1. توكن وصول قصير جداً (Short-Lived Access Token): مدته تتراوح بين 5 إلى 15 دقيقة فقط! ده التوكن اللي بيتسرب عبر الشبكة وبيكلم الـ REST API في كل طلب. حتى لو المخترق مسكه، بعد 10 دقائق هينتهي مفعوله تماماً ويتحول لقطعة خردة!
  2. توكن تجديد مشفر في الخزنة (Refresh Token): مدته 30 يوماً، ومخزن في الخزنة المشفرة للجهاز (iOS Keychain أو Android EncryptedSharedPreferences). التوكن ده مبيكلمش الـ API العادي أبداً؛ وظيفته الوحيدة إنه لما الـ Access Token ينتهي، تطبيق الموبايل يبعته لمسار خاص: POST /auth/v1/refresh.
  3. التدوير الإجباري الفوري (Automatic Rotation): مع كل عملية تجديد، السيرفر بيعمل حاجتين:
    • يصدر Access Token جديد لمدة 10 دقائق.
    • يحرق الـ Refresh Token القديم فوراً ويلغيه من الداتابيز، ويصدر مكانه Refresh Token جديد تماماً!
  4. اكتشاف سرقة التوكنات (Theft Detection): لو حصل وحاول مخترق يستخدم نفس الـ Refresh Token القديم المحروق مرة تانية، السيرفر بيكتشف فوراً إن في هجوم حاصل، ويقوم بحظر كافة التوكنات التابعة لنفس المستخدم فوراً وعمل Logout إجباري من كل الأجهزة! ده قمة الأمان السيبراني المعاصر.

حل معضلة الـ CORS Preflight مع ترويسات Authorization في خوادم Nginx

من أكتر المشاكل المحبطة اللي بتقابل المطورين لما يربطوا واجهة React أو Vue خارجية بـ REST API في ووردبريس، هي لما المتصفح يبعت طلب HTTP OPTIONS فخادم Nginx أو ووردبريس يرمي خطأ 401 Unauthorized أو 403 Forbidden قبل ما الريكوست الحقيقي يبدأ أصلاً! المشكلة دي سببها: المتصفح في طلب الـ Preflight (OPTIONS) ما بيبعتش ترويسة Authorization ولا بيانات الدخول! لو السيرفر بتاعك مفعل فحص الصلاحيات على مستوى خادم الويب بدون استثناء طلبات OPTIONS، الاتصال كله هيفشل. الحل المعماري الحاسم في إعدادات Nginx:

# معالجة طلبات OPTIONS Preflight فوراً وتمرير ترويسات CORS
if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '$http_origin' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-WP-Nonce' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Content-Length' 0;
    add_header 'Content-Type' 'text/plain charset=UTF-8';
    return 204;
}

السطور دي بتخلي Nginx يرد فوراً بكود 204 No Content مع ترويسات الـ CORS المسموحة دون تشغيل محرك PHP، مما يتيح للمتصفح إرسال الريكوست الحقيقي المرفق به توكن المصادقة بكل سلاسة وسرعة.

المصادقة الهجينة للتطبيقات الخارجية: الجمع بين Application Passwords و JWT

في الأنظمة الحديثة التي تتكامل مع تطبيقات الهاتف الذكي أو لوحات تحكم مستقلة، توفر ووردبريس ميزة Application Passwords لتوفير وصول آمن بدون مشاركة كلمة المرور الأصلية، كما تتيح حزم JWT Tokens مصادقة آمنة ومحمية بتشفير عالي عبر رؤوس الـ Authorization Headers.

الأسئلة الشائعة حول مصادقة REST في ووردبريس (20 سؤالاً تقنياً)

1. لماذا تفشل طلبات REST القادمة من Postman رغم تسجيلي للدخول في المتصفح؟

لأن Postman يعمل في بيئة معزولة ولا يملك كوكيز جلسة المتصفح ولا يرسل ترويسة X-WP-Nonce المطلوبة للمصادقة عبر الكوكيز في ووردبريس.

2. كيف أولد Nonce صالح لاستخدامه في طلبات الـ REST عبر JavaScript؟

باستخدام دالة ووردبريس الرسمية wp_create_nonce('wp_rest')، ثم تمريرها إلى ملف الـ JS عبر wp_localize_script() وإرسالها في ترويسة X-WP-Nonce.

3. ما هي ميزة Application Passwords ومتى تم تضمينها في النواة؟

تم تضمينها في ووردبريس 5.6، وهي ميزة تتيح للمستخدمين توليد كلمات مرور مخصصة للتطبيقات الخارجية دون مشاركة كلمة مرور حسابهم الأصلية مع إمكانية إلغائها في أي وقت.

4. هل تعمل كلمات مرور التطبيقات (Application Passwords) على المواقع غير المشفرة بـ HTTPS؟

لا، ترفض نواة ووردبريس تشغيلها افتراضياً على البروتوكول غير الآمن HTTP لمنع سرقة بيانات الاعتماد، وتتطلب بيئة SSL/TLS نشطة إلا في بيئات التطوير المحلية (Localhost).

5. ما هي وظيفة الفلتر النواتي determine_current_user؟

هو الفلتر المسؤول عن استخراج هوية المستخدم والتحقق منها من الترويسات أو الكوكيز وإرجاع الـ User ID لتثبيته في بيئة التشغيل كـ Current User.

6. ما هو كود الخطأ الذي يرجعه ووردبريس إذا كان الـ Nonce غير صالح؟

يرجع كود الحالة 403 Forbidden مصحوباً بكود الخطأ القياسي rest_cookie_invalid_nonce ورسالة تفيد بفشل التحقق من الكوكيز.

7. كيف تختلف مصادقة JWT عن مصادقة الكوكيز التقليدية؟

مصادقة JWT عديمة الحالة (Stateless) ومستقلة عن المتصفحات؛ حيث يحمل التوكن نفسه بيانات الهوية وتاريخ الانتهاء مشفراً وموقعاً رقمياً، بينما تعتمد الكوكيز على جلسات السيرفر والمتصفح.

8. ما هو التوقيع الرقمي (Signature) في توكن الـ JWT وما أهميته؟

هو ناتج تشفير الهيدر والـ Payload مع مفتاح سري خاص بالخادم باستخدام خوارزمية HMAC-SHA256، وأهميته التأكد من أن التوكن لم يتم التلاعب بمحتواه أو تزويره من قبل العميل.

9. كيف أتعامل مع خوادم Apache التي تحذف ترويسة Authorization تلقائياً؟

بإضافة القاعدة التالية في ملف .htaccess: SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 لإجبار الخادم على تمرير الترويسة لبيئة تشغيل PHP.

10. هل يمكن استخدام بروتوكول OAuth 2.0 مع ووردبريس؟

نعم، يمكن استخدام إضافات OAuth Server المخصصة لتمكين تسجيل الدخول بحساب ووردبريس في التطبيقات الخارجية الكبرى وفق معايير التفويض المؤسسية.

11. ما هي المدة الزمنية الموصى بها لصلاحية الـ Access Token في تطبيقات الهواتف؟

يوصى بأن تتراوح بين 15 دقيقة وساعة واحدة فقط لتقليل مخاطر سرقة التوكن، مع استخدام Refresh Token آمن لتجديد التوكن في الخلفية دون إزعاج المستخدم.

12. أين يجب تخزين الـ JWT Token في تطبيقات React أو Vue على المتصفح؟

يفضل تخزينه في كوكيز مؤمنة بنظام HttpOnly; Secure; SameSite=Strict لمنع قراءتها وسرقتها بواسطة سكريبتات الـ XSS الخبيثة.

13. كيف يمكنني إبطال (Revoke) توكن JWT مسرب قبل موعد انتهائه؟

عبر بناء قائمة سوداء للتوكنات (Token Blacklist) في Redis أو في جدول قاعدة البيانات تسجل المعرف الفريد للتوكن (jti) لفحصه ورفضه أثناء المصادقة.

14. هل يحتاج المستخدم لإرسال Nonce عند استخدام ترويسة Authorization: Bearer؟

لا، لا حاجة للـ Nonce عند استخدام Bearer Tokens أو Application Passwords؛ لأن هذه الطلبات ليست عرضة لهجمات الـ CSRF التلقائية للمتصفح.

15. كيف أمنع هجمات التخمين العنيف (Brute Force) على مسارات توليد التوكنات؟

بتطبيق محددات سرعة (Rate Limiting) تسمح بعدد محدود من المحاولات الفاشلة (مثلاً 5 محاولات لكل IP كل 15 دقيقة) وحظر العناوين المشبوهة مؤقتاً.

16. ما هو دور الدالة wp_set_current_user() في معمارية المصادقة؟

تقوم بتحميل بيانات المستخدم وصلاحياته ورتبته في الذاكرة وتعيينه كالمستخدم النشط الحالي في النواة لكافة العمليات البرمجية اللاحقة في نفس الريكوست.

17. كيف يمكن فحص ما إذا كان الطلب الحالي مصادقاً عليه عبر Application Password؟

باستخدام الدالة النواتية wp_is_application_passwords_available() وفحص الثابت الداخلي الذي تضبطه النواة عند نجاح المصادقة عبر كلمة مرور التطبيق.

18. ما الذي يحدث إذا تم تغيير كلمة المرور الرئيسية لحساب المستخدم في ووردبريس؟

يتم إلغاء كافة جلسات الكوكيز السابقة للمستخدم تلقائياً، ولكن كلمات مرور التطبيقات (Application Passwords) تظل تعمل ما لم يتم حذفها يدوياً من البروفايل.

19. كيف أحمي المفتاح السري (Secret Key) لتشفير التوكنات من التسريب في Git؟

بتخزينه كمتغير بيئة في السيرفر (Environment Variable) وقراءته عبر getenv('JWT_SECRET_KEY') أو تعريفه في wp-config.php المستبعد من الـ Version Control.

20. ما هي القاعدة الذهبية لاختيار طريقة المصادقة المناسبة في WordPress REST API؟

استخدم Cookie + Nonce للمتصفحات ولوحة التحكم، واستخدم Application Passwords للتكامل المباشر بين السيرفرات والأنظمة، واستخدم JWT لتطبيقات الهواتف والواجهات عديمة الحالة المنفصلة.

الصورة الرمزية لـ Mohamed Abozaid

م. محمد أبو زيد

WordPress Architect & Enterprise Consultant

مهندس برمجيات متخصص في تطوير حلول ووردبريس المتقدمة، معمارية Block Themes، ومحرر Gutenberg، وتحسين الأداء لمواقع الشركات الكبرى في مصر والخليج العربي.


اترك تعليقاً