Skip to content

पासवर्ड प्रबंधन

Potato में PBKDF2-SHA256 पासवर्ड hashing, एडमिन CLI और API से रीसेट, टोकन आधारित स्व-सेवा रीसेट लिंक, और SQLite या PostgreSQL में क्रेडेंशियल संग्रह कॉन्फ़िगर करें।

v2.4.0 में नया

Potato का प्रमाणीकरण सिस्टम PBKDF2-SHA256, 100,000 पुनरावृत्तियों और प्रति-उपयोगकर्ता salt का इस्तेमाल करता है, यानी वही तरीक़ा जिसकी सिफ़ारिश NIST सुरक्षित पासवर्ड संग्रह के लिए करता है। यह पृष्ठ बताता है कि पासवर्ड कैसे रखे जाते हैं, उन्हें कैसे रीसेट करें, और सर्वर पुनरारंभ होने पर क्रेडेंशियल कैसे बनाए रखें।

यह in_memory और database तरीक़ों पर लागू होता है। OAuth में पासवर्ड पहचान प्रदाता के पास होता है, इसलिए इसमें से कुछ भी लागू नहीं होता, सिवाय मिश्रित मोड के स्थानीय खातों के।

सुरक्षा कार्यान्वयन

पासवर्ड salt$hash फ़ॉर्मैट में रखे जाते हैं:

  • 32 अक्षर का hex salt, हर उपयोगकर्ता के लिए अलग
  • 64 अक्षर का hex digest, जो पासवर्ड से उसी salt और 100,000 पुनरावृत्तियों के साथ PBKDF2-HMAC-SHA256 द्वारा निकाला जाता है
  • टाइमिंग हमलों से बचने के लिए hmac.compare_digest से नियत-समय तुलना

salt लगे पासवर्ड पर SHA-256 का एक अकेला पास इतना तेज़ होता है कि बड़े पैमाने पर brute-force किया जा सके। 100,000 पुनरावृत्तियाँ ही हर अनुमान को महँगा बनाती हैं।

user_config.json फ़ाइलों में पड़े मौजूदा सादे पासवर्ड लोड होते समय Potato अपने आप अलग-अलग salt के साथ फिर से hash कर देता है, कोई मैन्युअल माइग्रेशन नहीं करना पड़ता।

डिफ़ॉल्ट कॉन्फ़िगरेशन

डिफ़ॉल्ट रूप से Potato इन-मेमोरी प्रमाणीकरण इस्तेमाल करता है। require_password एक टॉप-लेवल कुंजी है, authentication ब्लॉक का हिस्सा नहीं:

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

टिकाऊ क्रेडेंशियल

साइन-अप फ़ॉर्म से बनाए गए खाते एक JSONL फ़ाइल में लिखे जाते हैं और अगली बार शुरू होने पर वापस पढ़े जाते हैं। in_memory में यह फ़ाइल आउटपुट डायरेक्टरी के बगल में user_config.json होती है, जब तक आप कोई और फ़ाइल न बताएँ।

फ़ाइल आधारित संग्रह

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

पाथ तब बताएँ जब कई सर्वर इंस्टेंस एक ही उपयोगकर्ता सूची साझा करते हों, या जब आप सूची को एनोटेशन के बगल के बजाय कहीं और रखना चाहें। नए पंजीकरण और पासवर्ड बदलाव उसी समय लिख दिए जाते हैं।

उपयोगकर्ता सूची को एनोटेशन आउटपुट के साथ रखें। हर एनोटेटर की डायरेक्टरी का नाम उसके उपयोगकर्ता नाम पर होता है। अगर उपयोगकर्ता सूची खो जाए और आउटपुट डायरेक्टरी बची रहे, तो वह उपयोगकर्ता नाम टाइप करने वाला अगला व्यक्ति किसी और का काम पा जाएगा। इसलिए Potato पंजीकरण से इनकार कर देता है, जिसका मतलब है कि जब तक आप फ़ाइल वापस नहीं लाते, एनोटेटर दोबारा अंदर नहीं आ सकता।

v2.8.3 से पहले, जब तक user_config_path स्पष्ट रूप से सेट न हो, in_memory कुछ नहीं लिखता था, इसलिए खाते पुनरारंभ के बाद नहीं बचते थे। अगर आपने किसी पुराने बिल्ड पर अध्ययन चलाया था, तो वे खाते चले गए हैं; एनोटेशन नहीं गए।

डेटाबेस बैकएंड

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"

Potato पहली बार शुरू होने पर users टेबल बनाता है और बेहतर समवर्ती रीड के लिए SQLite को WAL मोड में चलाता है। database_url की शुरुआत sqlite:/// या postgresql:// से होनी चाहिए। आप एनवायरनमेंट में POTATO_DB_CONNECTION भी सेट कर सकते हैं; दोनों मौजूद हों तो database_url उस पर भारी पड़ता है।

ध्यान दें: method: database और user_config_path एक साथ इस्तेमाल नहीं हो सकते, दोनों में से एक ही संग्रह रणनीति चुनें। दोनों कॉन्फ़िगर हों तो Potato त्रुटि देता है।

पासवर्ड रीसेट करना

एडमिन CLI

कमांड लाइन से पासवर्ड रीसेट करें:

bash
# Prompts for username and password
potato reset-password config.yaml
 
# Prompts for the password only
potato reset-password config.yaml --username annotator1

एडमिन API

एडमिन 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"}'

कुंजी इसी क्रम में आती है: टॉप-लेवल admin_api_key सेटिंग से, POTATO_ADMIN_API_KEY एनवायरनमेंट वेरिएबल से, या टास्क डायरेक्टरी में बनी admin_api_key.txt फ़ाइल से।

स्व-सेवा टोकन रीसेट

जो एनोटेटर अपना पासवर्ड भूल जाते हैं, वे उसे ख़ुद रीसेट कर सकते हैं। वे /forgot-password पर जाकर अपना उपयोगकर्ता नाम डालते हैं, और Potato 24 घंटे तक वैध, एक बार इस्तेमाल होने वाला टोकन बनाता है। रीसेट लिंक स्क्रीन पर दिखता है ताकि एडमिन उसे आगे भेज सके; Potato कोई ईमेल नहीं भेजता। एनोटेटर /reset/<token> खोलकर नया पासवर्ड सेट करता है, जिससे टोकन इस्तेमाल हो जाता है।

इस प्रवाह के लिए किसी कॉन्फ़िगरेशन की ज़रूरत नहीं है। require_password: true सेट होने पर लॉगिन पेज पर "Forgot Password?" लिंक दिखता है।

एडमिन सीधे भी टोकन बना सकते हैं:

bash
curl -X POST http://localhost:8000/admin/create_reset_token \
  -H "X-API-Key: $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"username": "annotator1"}'
 
# {"reset_link": "http://localhost:8000/reset/abc123...",
#  "token": "abc123...", "expires_in_hours": 24}

अलग समय-सीमा के लिए रिक्वेस्ट बॉडी में "ttl_hours": 48 भेजें।

पासवर्ड-रहित मोड

कक्षा में दिखाने, जल्दी निपटने वाले अध्ययनों, या बाहरी प्रमाणीकरण (MTurk, Prolific) वाले कामों के लिए आप पासवर्ड पूरी तरह बंद कर सकते हैं:

yaml
require_password: false
 
authentication:
  method: in_memory

एनोटेटर कोई भी उपयोगकर्ता नाम डालकर लॉगिन कर लेते हैं और पासवर्ड नहीं पूछा जाता। संवेदनशील डेटा या पहचान की पुष्टि माँगने वाले कामों के लिए यह ठीक नहीं है।

विवरण के लिए पासवर्ड-रहित लॉगिन देखें।

पूरा संदर्भ

yaml
# Top-level: require a password at login (default: true)
require_password: true
 
# Top-level: key for the admin endpoints
admin_api_key: ${POTATO_ADMIN_API_KEY}
 
authentication:
  # in_memory (default) | database | clerk | oauth
  method: in_memory
 
  # in_memory only, mutually exclusive with method: database
  user_config_path: users.jsonl
 
  # database only; sqlite:/// or postgresql://
  # database_url: "sqlite:///auth.db"
 
user_config:
  users:
    - username: "researcher"
      password: "secure-passphrase"
    - username: "annotator1"
      password: "initial-pass"
एंडपॉइंटमेथडप्रमाणीकरणविवरण
/forgot-passwordGET, POSTकोई नहींरीसेट टोकन का अनुरोध करें
/reset/<token>GET, POSTकोई नहींनया पासवर्ड सेट करें
/admin/reset_passwordPOSTAPI कुंजीएडमिन द्वारा पासवर्ड रीसेट
/admin/create_reset_tokenPOSTAPI कुंजीरीसेट टोकन बनाएँ

आगे पढ़ें

कार्यान्वयन के विवरण के लिए स्रोत दस्तावेज़ देखें।