पासवर्ड प्रबंधन
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 ब्लॉक का हिस्सा नहीं:
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 होती है, जब तक आप कोई और फ़ाइल न बताएँ।
फ़ाइल आधारित संग्रह
authentication:
method: in_memory
user_config_path: /shared/path/to/user_config.jsonlपाथ तब बताएँ जब कई सर्वर इंस्टेंस एक ही उपयोगकर्ता सूची साझा करते हों, या जब आप सूची को एनोटेशन के बगल के बजाय कहीं और रखना चाहें। नए पंजीकरण और पासवर्ड बदलाव उसी समय लिख दिए जाते हैं।
उपयोगकर्ता सूची को एनोटेशन आउटपुट के साथ रखें। हर एनोटेटर की डायरेक्टरी का नाम उसके उपयोगकर्ता नाम पर होता है। अगर उपयोगकर्ता सूची खो जाए और आउटपुट डायरेक्टरी बची रहे, तो वह उपयोगकर्ता नाम टाइप करने वाला अगला व्यक्ति किसी और का काम पा जाएगा। इसलिए Potato पंजीकरण से इनकार कर देता है, जिसका मतलब है कि जब तक आप फ़ाइल वापस नहीं लाते, एनोटेटर दोबारा अंदर नहीं आ सकता।
v2.8.3 से पहले, जब तक user_config_path स्पष्ट रूप से सेट न हो, in_memory कुछ नहीं लिखता था, इसलिए खाते पुनरारंभ के बाद नहीं बचते थे। अगर आपने किसी पुराने बिल्ड पर अध्ययन चलाया था, तो वे खाते चले गए हैं; एनोटेशन नहीं गए।
डेटाबेस बैकएंड
SQLite (कोई अतिरिक्त निर्भरता नहीं):
authentication:
method: database
database_url: "sqlite:///auth/users.db"PostgreSQL (psycopg2-binary चाहिए):
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
कमांड लाइन से पासवर्ड रीसेट करें:
# Prompts for username and password
potato reset-password config.yaml
# Prompts for the password only
potato reset-password config.yaml --username annotator1एडमिन API
एडमिन API कुंजी के साथ प्रोग्राम से रीसेट करें:
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?" लिंक दिखता है।
एडमिन सीधे भी टोकन बना सकते हैं:
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) वाले कामों के लिए आप पासवर्ड पूरी तरह बंद कर सकते हैं:
require_password: false
authentication:
method: in_memoryएनोटेटर कोई भी उपयोगकर्ता नाम डालकर लॉगिन कर लेते हैं और पासवर्ड नहीं पूछा जाता। संवेदनशील डेटा या पहचान की पुष्टि माँगने वाले कामों के लिए यह ठीक नहीं है।
विवरण के लिए पासवर्ड-रहित लॉगिन देखें।
पूरा संदर्भ
# 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-password | GET, POST | कोई नहीं | रीसेट टोकन का अनुरोध करें |
/reset/<token> | GET, POST | कोई नहीं | नया पासवर्ड सेट करें |
/admin/reset_password | POST | API कुंजी | एडमिन द्वारा पासवर्ड रीसेट |
/admin/create_reset_token | POST | API कुंजी | रीसेट टोकन बनाएँ |
आगे पढ़ें
- SSO और OAuth प्रमाणीकरण: Google, GitHub या संस्थागत SSO से साइन इन
- पासवर्ड-रहित लॉगिन: खुले कामों के लिए सिर्फ़ उपयोगकर्ता नाम से पहुँच
- प्रोडक्शन सेटअप: HTTPS और रिवर्स प्रॉक्सी कॉन्फ़िगरेशन
- एडमिन डैशबोर्ड: एनोटेटर खातों का प्रबंधन
कार्यान्वयन के विवरण के लिए स्रोत दस्तावेज़ देखें।