2009-04-22 22 views
9

में अद्वितीय और अपारदर्शी उपयोगकर्ता आईडी उत्पन्न करना मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो पंजीकृत उपयोगकर्ताओं को सामग्री बनाने या अपलोड करने देता है, और अज्ञात उपयोगकर्ताओं को उस सामग्री को देखने और उस सामग्री को खोजने के लिए पंजीकृत उपयोगकर्ताओं के पृष्ठों को ब्राउज़ करने की अनुमति देता है - यह है फ़्लिकर जैसी साइट, उदाहरण के लिए, लोगों को अपने उपयोगकर्ताओं के पृष्ठों को ब्राउज़ करने की अनुमति देता है।Google App Engine

ऐसा करने के लिए, मुझे अज्ञात HTTP GET अनुरोध में उपयोगकर्ता की पहचान करने का एक तरीका चाहिए। उपयोगकर्ता को http://myapplication.com/browse/<userid>/<contentid> टाइप करने और सही पृष्ठ पर जाने में सक्षम होना चाहिए - अद्वितीय होना चाहिए, लेकिन गोपनीयता कारणों से उपयोगकर्ता के ईमेल पते की तरह कुछ नहीं होना चाहिए।

Google ऐप इंजन के माध्यम से, मैं उपयोगकर्ता से जुड़े ईमेल पते को प्राप्त कर सकता हूं, लेकिन जैसा कि मैंने कहा, मैं इसका उपयोग नहीं करना चाहता हूं। मेरे पंजीकरण के दौरान मेरे आवेदन के उपयोगकर्ता एक अद्वितीय उपयोगकर्ता नाम चुन सकते हैं, लेकिन यदि संभव हो तो मैं इसे वैकल्पिक बनाना चाहूंगा, ताकि पंजीकरण प्रक्रिया जितनी छोटी हो सके।

पंजीकरण प्रक्रिया के दौरान कुछ यादृच्छिक कुकी (एक GUID?) उत्पन्न करना एक और विकल्प है, और इसका उपयोग करें, मुझे डेटाबेस की यात्रा के बिना ऐसी कुकी की विशिष्टता की गारंटी देने का एक स्पष्ट तरीका दिखाई नहीं देता है।

क्या कोई तरीका है, ऐप इंजन उपयोगकर्ता ऑब्जेक्ट को उस ऑब्जेक्ट के लिए एक अद्वितीय पहचानकर्ता प्राप्त करने का तरीका है जिसका उपयोग इस तरह किया जा सकता है?

मैं पाइथन समाधान की तलाश में हूं - मैं भूल गया कि जीएई अब जावा का भी समर्थन करता है। फिर भी, मैं भाषा की परवाह किए बिना तकनीकों को समान होने की उम्मीद करता हूं।

उत्तर

7

आपका समय त्रुटिहीन है: बस कल, SDK का एक नया रिलीज, बाहर आया unique, permanent user IDs लिए समर्थन के साथ। वे आपके द्वारा निर्दिष्ट सभी मानदंडों को पूरा करते हैं।

+0

"यदि वर्तमान उपयोगकर्ता साइन इन नहीं है, तो उपयोगकर्ता कन्स्ट्रक्टर उपयोगकर्ताNotFoundError उठाता है।" - यानी इसे Google साइन इन की आवश्यकता है। हालांकि, मैं कहूंगा कि Google साइन-इन तंत्र का उपयोग करना स्वयं को रोल करने से बेहतर है, खासकर उपयोगकर्ता अपेक्षाओं के लिए। – Mark

+1

हालांकि, यह मेरे लिए होता है कि user_id दुनिया अद्वितीय हो सकता है, जो अच्छा नहीं होगा। – Mark

+0

ऐसा लगता है कि यह वही है जो मैं वास्तव में देख रहा हूं। मैं Google साइन-इन का उपयोग करता हूं, और एक विश्व अद्वितीय उपयोगकर्ता_आईडी वास्तव में एक आवश्यकता है। उत्तम। –

1

क्या आपका मतलब session cookies है?

http://code.google.com/p/gaeutilities/


क्या DzinX कहा की कोशिश करो। एक अपारदर्शी कुंजी बनाने का एकमात्र तरीका जिसे डेटाबेस राउंडट्रिप के बिना प्रमाणीकृत किया जा सकता है, एन्क्रिप्शन या क्रिप्टोग्राफ़िक हैश का उपयोग कर रहा है।

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

आप Google डॉक्स कुंजी की तरह एक टोकन के साथ समाप्त हो जाएंगे, मूल रूप से उपयोगकर्ता को प्रमाणीकृत साबित करने वाला एक हस्ताक्षर, जिसे डेटाबेस को छूए बिना सत्यापित किया जा सकता है।

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

+0

नहीं, मैं सत्र कुकीज़ मतलब यह नहीं है। GAE पहले से ही लॉग इन उपयोगकर्ता का ट्रैक रखने के लिए प्रदान करता है। मेरा प्रश्न विशेष रूप से अज्ञात उपयोगकर्ताओं और एक पंजीकृत उपयोगकर्ता से जुड़ी सामग्री के साथ उनकी बातचीत के साथ सौदा करता है। –

+0

मेरा सुझाव गैर-लॉग इन उपयोगकर्ता के लिए gaeutilities का उपयोग करना है। – Mark

+0

उपयोगकर्ताओं में लॉग इन नहीं किया गया है, जो पूरी तरह से स्टेटलेस तरीके से एप्लिकेशन के साथ इंटरैक्ट करते हैं, इसलिए यह वास्तव में लागू नहीं है। सूचक के लिए धन्यवाद, हालांकि - यह एक आसान पुस्तकालय की तरह दिखता है। –

3

मुझे लगता है कि आप उन के दो प्रकार के बीच अंतर करना चाहिए:

1) उन है कि Google खातों के माध्यम से प्रवेश कर लिया है या जो पहले से ही एक गैर गूगल ई-मेल एड्रेस

साथ अपनी साइट पर पंजीकृत किया है 2) उपयोगकर्ता जिन्होंने पहली बार आपकी साइट खोली और

दूसरे मामले के लिए, मैं कुछ यादृच्छिक स्ट्रिंग उत्पन्न करने के अलावा कोई अन्य तरीका नहीं देख सकता (उदाहरण के लिए uuid.uuid4() या इस उपयोगकर्ता के सत्र कुकी से कुंजी), एक अनाम उपयोगकर्ता के रूप में अपने साथ कोई अनूठी जानकारी नहीं लेती है।उनके ई-मेल एड्रेस -

उन है कि में लॉग इन किया लिए, तथापि, आप पहले से ही एक अद्वितीय पहचानकर्ता है। मैं आपकी गोपनीयता चिंताओं से सहमत हूं - आपको इसे पहचानकर्ता के रूप में उपयोग नहीं करना चाहिए। इसके बजाय, कैसे एक स्ट्रिंग है यादृच्छिक लगता है, लेकिन वास्तव में ई-मेल एड्रेस से उत्पन्न होता है पैदा करने के बारे में? हैशिंग फ़ंक्शंस इस उद्देश्य के लिए बिल्कुल सही हैं। उदाहरण:

>>> import hashlib 

>>> email = '[email protected]' 
>>> salt = 'SomeLongStringThatWillBeAppendedToEachEmail' 

>>> key = hashlib.sha1('%s$%s' % (email, salt)).hexdigest() 
>>> print key 
f6cd3459f9a39c97635c652884b3e328f05be0f7 

hashlib.sha1 के रूप में एक यादृच्छिक समारोह नहीं है, लेकिन दिए गए आंकड़ों रिटर्न हमेशा एक ही परिणाम के लिए, लेकिन यह व्यावहारिक रूप से अपरिवर्तनीय साबित हुआ है, आप सुरक्षित रूप से उपयोगकर्ता ई समझौता किए बिना वेबसाइट पर टुकड़ों में बांटा कुंजी पेश कर सकते हैं -मेल के पते। साथ ही, आप सुरक्षित रूप से यह मान सकते हैं कि अलग-अलग ई-मेल के दो हैंश समान नहीं होंगे (वे हो सकते हैं, लेकिन इसकी होने वाली संभावना बहुत छोटी है)। हैशिंग फ़ंक्शंस के बारे में अधिक जानकारी के लिए, the Wikipedia entry से परामर्श लें।

+0

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