Skip to content

إدارة كلمات المرور

هيّئ تجزئة كلمات المرور بـ PBKDF2-SHA256، وإعادة التعيين عبر سطر أوامر المشرف أو الـ API، وتدفقات إعادة التعيين الذاتية بالرموز، وتخزين بيانات الاعتماد في SQLite أو PostgreSQL في Potato.

جديد في الإصدار v2.4.0

يستخدم نظام المصادقة في Potato خوارزمية PBKDF2-SHA256 بـ 100000 تكرار مع ملح خاص بكل مستخدم — وهو الأسلوب نفسه الذي يوصي به NIST لتخزين كلمات المرور بأمان. تشرح هذه الصفحة كيف تُخزَّن كلمات المرور، وكيف تُعاد تعيينها، وكيف تُحفظ بيانات الاعتماد بين عمليات إعادة تشغيل الخادم.

تفاصيل التنفيذ الأمني

تُخزَّن كلمات المرور بصيغة salt$hash:

  • ملح سداسي عشري من 32 محرفاً، فريد لكل مستخدم
  • تجزئة SHA-256 من 64 محرفاً لـ salt + password
  • مقارنة بزمن ثابت عبر hmac.compare_digest لمنع هجمات التوقيت

أما كلمات المرور الموجودة كنص صريح في ملفات user_config.jsonl فتُعاد تجزئتها تلقائياً بأملاح فريدة عند تحميلها في Potato — لا حاجة إلى ترحيل يدوي.

التهيئة الافتراضية

يستخدم Potato افتراضياً المصادقة في الذاكرة. ويجب إدراج المعلّقين في ملف التهيئة:

yaml
authentication:
  method: in_memory
  require_password: true
 
user_config:
  users:
    - username: "annotator1"
      password: "initial-password"   # will be hashed on first load
    - username: "annotator2"
      password: "initial-password"

بيانات الاعتماد الدائمة

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

الحفظ في ملف

yaml
authentication:
  method: in_memory
  user_config_path: /shared/path/to/user_config.jsonl

يكتب Potato بيانات الاعتماد المجزّأة في هذا الملف، ويقرأها عند إعادة التشغيل — فتبقى كلمات المرور التي ضُبطت أو غُيّرت أثناء الجلسة بعد إعادة التشغيل.

قاعدة بيانات

SQLite (بلا اعتماديات إضافية):

yaml
authentication:
  method: database
  database_url: "sqlite:///auth/users.db"

PostgreSQL (تتطلب psycopg2-binary):

yaml
authentication:
  method: database
  database_url: "postgresql://user:password@localhost:5432/potato_auth"

تُنشأ جداول قاعدة البيانات تلقائياً عند أول تشغيل.

ملاحظة: لا يجتمع method: database مع user_config_path — اختر إحدى استراتيجيتي الحفظ.

إعادة تعيين كلمات المرور

سطر أوامر المشرف

أعد تعيين كلمة مرور من سطر الأوامر:

bash
# Reset a specific user's password
potato reset-password config.yaml --username annotator1
 
# Prompted for new password interactively

واجهة برمجة المشرف

أعد التعيين برمجياً باستخدام مفتاح API:

bash
curl -X POST http://localhost:8000/admin/reset_password \
  -H "X-API-Key: $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"username": "annotator1", "new_password": "new-secure-password"}'

إعادة التعيين الذاتية بالرموز

يدعم Potato تدفق إعادة تعيين يبدأه المستخدم نفسه. ينتقل المستخدمون إلى /forgot-password، ويدخلون اسم المستخدم، فيحصلون على رمز إعادة تعيين يُستخدم مرة واحدة. ثم يزورون /reset/<token> لضبط كلمة مرور جديدة.

تصلح الرموز لمدة 24 ساعة ولا تُستخدم إلا مرة واحدة. ولا يرسل Potato رسائل بريد إلكتروني — يوزّع المشرف رابط إعادة التعيين يدوياً.

التفعيل في ملف التهيئة:

yaml
authentication:
  method: database
  database_url: "sqlite:///auth/users.db"
  allow_password_reset: true
  reset_token_ttl_hours: 24

سير عمل المشرف:

bash
# Generate a reset token for a user
curl -X POST http://localhost:8000/admin/generate_reset_token \
  -H "X-API-Key: $ADMIN_API_KEY" \
  -d '{"username": "annotator1"}'
 
# Returns: {"reset_url": "https://your-server.com/reset/abc123..."}
# Share this URL with the annotator

الوضع بلا كلمة مرور

في العروض الصفية والدراسات السريعة والمهام التي تعتمد مصادقة خارجية (MTurk وProlific)، يمكنك تعطيل كلمات المرور بالكامل:

yaml
authentication:
  method: in_memory
  require_password: false

يدخل المعلّقون بأي اسم مستخدم — ولا تظهر مطالبة بكلمة مرور. وهذا غير مستحسن للبيانات الحساسة أو المهام التي تتطلب هوية موثّقة.

راجع تسجيل الدخول بدون كلمة مرور للتفاصيل.

المرجع الكامل

yaml
authentication:
  method: in_memory       # in_memory | database | oauth | clerk
 
  # In-memory options
  require_password: true
  user_config_path: path/to/users.jsonl   # optional persistence
 
  # Database options (mutually exclusive with user_config_path)
  database_url: "sqlite:///auth/users.db"
 
  # Self-service reset
  allow_password_reset: true
  reset_token_ttl_hours: 24
 
user_config:
  users:
    - username: "researcher"
      password: "secure-passphrase"
      role: admin
    - username: "annotator1"
      password: "initial-pass"
      role: annotator

قراءة إضافية

للاطلاع على تفاصيل التنفيذ، راجع الوثائق المصدرية.