نقطة نهاية API users/by-external/ تفشل مع رؤوس التفويض، وتعمل بدونها

بدءًا من 24 مارس، يبدو أنه كان هناك تغيير في الطريقة التي تستجيب بها واجهة برمجة تطبيقات Discourse للطلبات.

لم يتم إجراء أي تغييرات على الكود من جانبنا، ولا يزال مفتاح واجهة برمجة التطبيقات (Api-Key) صالحًا، ولكن إحدى خدمات الواجهة الخلفية لدينا التي تحاول الحصول على معلومات المستخدم بدأت في الفشل عند الوصول إلى users/by-external/{id}.json.

نرسل رؤوس Api-Key و Api-Username مع هذه الطلبات، والتي يجب أن تكون مطلوبة، وفقًا للتوثيق. هذه الطلبات كانت تعمل بشكل جيد لسنوات.

الآن، تفشل جميع الطلبات المقدمة إلى هذا نقطة النهاية برمز 403، وجسم الاستجابة:

{
    "errors": [
        "أنت غير مسموح لك بعرض المورد المطلوب."
    ],
    "error_type": "invalid_access"
}

يحدث هذا أيضًا إذا حاولت طلب /u/{username}.json.

بشكل مدهش، عندما لا أرسل الرؤوس، فإن هذه الطلبات التي تتطلب وفقًا للتوثيق رؤوس المصادقة تستجيب بالفعل بالبيانات المطلوبة، كما لو كانت مصادق عليها.

لقد حاولت أيضًا إرسال مفتاح واجهة برمجة تطبيقات غير صحيح، وتستجيب برسالة مختلفة قليلاً:

{
    "errors": [
        "أنت غير مسموح لك بعرض المورد المطلوب. اسم مستخدم واجهة برمجة التطبيقات أو المفتاح غير صالح."
    ],
    "error_type": "invalid_access"
}

هذا يخبرني أن المفتاح يتم قبوله، ولكنه يبلغ بشكل خاطئ أنه لا يمنح الوصول إلى المورد، بينما يمنح الطلبات غير المصادق عليها وصولاً كاملاً.

لقد اختبرت للتو باستخدام مفتاح واجهة برمجة تطبيقات جديد تمامًا مع خيارات جميع المستخدمين / عالمية، وأحصل على نفس النتائج.

4 إعجابات

بعد العمل على هذا مع @Tim_Scaffidi، أدركنا أن المستخدم الذي تم تمريره لـ Api-Username قد تم إلغاء تنشيطه تلقائيًا بواسطة SiteSetting.invalidate_inactive_admin_email_after_days. من المحتمل وجود خطأ متعلق بهذا الإعداد حيث أن استدعاءات API التي يقوم بها المستخدم لا تقوم بتحديث نشاط “تسجيل الدخول” الخاص بهذا المستخدم.

7 إعجابات

لقد بحثت في هذا الأمر مرة أخرى لمعرفة ما إذا كان هناك أي رمز يجب تغييره لتحسين الأمور، ولكن نظرًا لأن المشكلة حدثت فقط بسبب استخدام مفتاح واجهة برمجة تطبيقات “لجميع المستخدمين”، فلا أعتقد أنه يجب علينا تغيير أي شيء من ناحية الرمز. أفضل خيار لتجنب إلغاء تنشيط المستخدم هو استخدام مفتاح واجهة برمجة تطبيقات “لمستخدم واحد” حتى نتمكن من التحقق من last_used_at في سجل مفتاح واجهة برمجة التطبيقات بدلاً من محاولة التحقق من last_seen_at في سجل المستخدم.

إعجاب واحد (1)