Rate limit account authentication attempts

This commit is contained in:
Hamza Ayed
2026-10-03 00:59:47 +03:00
parent f745bed0f7
commit 5430d4ac4b
6 changed files with 165 additions and 4 deletions
+1 -1
View File
@@ -165,7 +165,7 @@ python scripts/eval_knowledge_retrieval.py --dataset evals/knowledge_retrieval_p
- يوفّر API الآن `POST /v1/auth/register` و`POST /v1/auth/login` و`GET /v1/auth/me` و`POST /v1/auth/logout`. كلمات المرور تُخزن بتجزئة PBKDF2 مع salt؛ رمز الجلسة العشوائي يُخزن كـSHA-256 وينتهي بعد 7 أيام ويمكن إلغاؤه. أضاف Flutter واجهة تسجيل ودخول وخروج، ويحفظ رمز الحساب عبر `flutter_secure_storage` حيث تتوفر آلية النظام. على الويب تعتمد الحزمة على تخزين المتصفح؛ دعمها تجريبي ويحتاج HTTPS أو localhost، لذا لا نعدّه حماية مماثلة لمخزن مفاتيح نظام التشغيل.
- بناء Windows يتطلب مكوّن C++ ATL ضمن Visual Studio Build Tools بسبب إضافة `flutter_secure_storage_windows`؛ إذا ظهر خطأ `atlstr.h` ثبّت المكوّن ثم أعد بناء التطبيق. على Android الحد الأدنى صار API 23.
- كل عمليات `/v1/*` الخاصة تتطلب الآن Bearer session؛ الاستثناءات العامة هي الصحة وقائمة النماذج وتسجيل/دخول الحساب وإنشاء الجلسة المحلية. عميل Flutter يرسل الجلسة للمحادثة والوكيل والملفات والمعرفة والبحث والصوت. ملكية سجل تدقيق الوكيل وفهرس المعرفة ومقترحات تعديل الملفات مرتبطة بمعرّف الحساب.
- أساس API متعدد الحسابات لا يكفي لفتح الخدمة للشبكة: لا توجد حدود لمحاولات الدخول أو استعادة كلمة المرور، ويجب حصر مساحات العمل التي يستطيع كل حساب قراءتها ضمن مجلدات مصرح بها؛ عملية FastAPI ترى صلاحيات ملفات نظام التشغيل الذي يشغلها. أبقِ الخدمة على `127.0.0.1` إلى أن تكتمل هذه الضوابط ويُختبر النشر عبر TLS.
- أضيف حد أولي لمحاولات الدخول وإنشاء الحسابات في SQLite، لكنه لم يخضع بعد لاختبار ضغط/خلف reverse proxy؛ ولا توجد استعادة لكلمة المرور. كذلك يجب حصر مساحات العمل التي يستطيع كل حساب قراءتها ضمن مجلدات مصرح بها؛ عملية FastAPI ترى صلاحيات ملفات نظام التشغيل الذي يشغلها. أبقِ الخدمة على `127.0.0.1` إلى أن تكتمل هذه الضوابط ويُختبر النشر عبر TLS.
- رسائل الدردشة ترسل إلى Ollama المحلي. التسجيل الصوتي يحوّل إلى نص عبر Groq Whisper؛ لذلك يُرسل الصوت إلى Groq عند الضغط على إيقاف التسجيل.
- مفتاح Groq يجب أن يبقى في متغير البيئة `GROQ_API_KEY` الخاص بخادم FastAPI، ولا يوضع في Flutter أو في ملفات المشروع.
- على جهاز التطوير الحالي حُفظ المتغير في بيئة Windows الخاصة بالمستخدم، وليس في ملف `.env`. يقرأه `start-api.ps1` عند تشغيل الخادم، ويظهر `/health` حالة الإعداد فقط دون إظهار المفتاح. عند استضافة الخادم لاحقًا، أضف المفتاح إلى إعدادات البيئة السرية في خدمة الاستضافة.