2011-08-28 22 views
15

में लिखे गए एक निजी आरईएसटी एपीआई को सुरक्षित करने के लिए सलाह की तलाश में है, मैं वर्तमान में माइक्रोफ्रेमवर्क फ्लास्क के साथ अजगर में एक बाकी एपीआई लिख रहा हूं। यह एक निजी एपीआई है और यह उपयोगकर्ता डेटा से संबंधित है। मैं एक वेब और एक एंड्रॉइड ऐप बनाने के लिए इस एपीआई का उपयोग करने की योजना बना रहा हूं।पायथन-फ्लास्क

अब के लिए मैं निजी उपयोगकर्ता डेटा सुरक्षित करने के लिए पाचन ऑथ का उपयोग करता हूं। उदाहरण के लिए यदि आप उपयोगकर्ता सेवा के साथ मेरी सेवा पर डेटा पोस्ट करना चाहते हैं तो आप myapi/story/create पर एक पोस्ट अनुरोध करते हैं और पाचन पैटर्न के साथ बॉब के क्रेडेंशियल्स प्रदान करते हैं।

मुझे पता है यह एक अच्छा समाधान वजह से नहीं है हूँ:
-Digest प्रमाणन
-इस ग्राहक प्रमाणीकृत नहीं है सुरक्षित नहीं है (? कैसे वर्तमान उपयोगकर्ता के साथ संबंधित नहीं अनुरोध सुरक्षित करने के लिए, उदाहरण के लिए एक नया उपयोगकर्ता बनाने)

मैंने ओथ के बारे में बहुत सी चीजें पढ़ी हैं लेकिन 3-पैर वाले प्रमाणीकरण ओवरकिल लगता है क्योंकि मैं अपनी एपीआई को तीसरे पक्ष में खोलने की योजना नहीं बना रहा हूं।
2-पैर वाले ओएथ फिट नहीं होंगे क्योंकि यह केवल ग्राहकों के लिए प्रमाणीकरण प्रदान करता है, न कि उपयोगकर्ताओं के लिए।
ओथ के साथ एक और समस्या यह है कि मुझे पायथन में इसे लागू करने के लिए एक व्यापक मार्गदर्शिका नहीं मिली है। मुझे python-oauth2 लाइब्रेरी मिली, लेकिन मुझे सर्वर उदाहरण समझ में नहीं आया और मुझे अतिरिक्त दस्तावेज नहीं मिल रहे हैं। इसके अलावा ऐसा लगता है कि ओथ के कई पहलुओं को इस उदाहरण में शामिल नहीं किया गया है।

तो मेरी प्रश्न हैं:

  1. वहां वैकल्पिक योजना (नहीं oAuth) प्रमाणित के लिए दोनों क्लाइंट और सुरक्षा का एक उचित स्तर के साथ उपयोगकर्ता है?
  2. यदि ओएथ सबसे अच्छा समाधान है:
    • प्राधिकरण प्रक्रिया को कैसे छोड़ें (क्योंकि उपयोगकर्ताओं को तृतीय पक्ष क्लाइंट को अधिकृत नहीं करना होगा)?
    • क्या Python-oauth2 के लिए या किसी अन्य पायथन पुस्तकालय के लिए डिटेल्ड दस्तावेज है?

कोई मदद या सलाह की सराहना की जाएगी।

+0

, प्रमुख वेबसाइटों के एक बड़े हिस्से आप ग्राहक आदि के माध्यम से साइन अप करने दे नहीं करते, वे आपको अपनी वेबसाइट के माध्यम से साइन अप करें। उन साइटों के लिए जो इसकी अनुमति देते हैं, उनके एपीआई कॉल प्रभावी रूप से उनके साइनअप फॉर्म के समान ही होते हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि यह सुरक्षित है या नहीं। –

उत्तर

7

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

यदि आप ग्राहक को प्रमाणित करना चाहते हैं, तो आप SSL क्लाइंट प्रमाणपत्र का उपयोग कर सकते हैं।ऐसा कहा जाता है कि, आम तौर पर दुर्भावनापूर्ण उपयोगकर्ताओं के खिलाफ क्लाइंट को लॉक करना बहुत कठिन होता है, इसलिए मैं साइन-अप फ़ंक्शंस को खुले तौर पर सुलभ बनाने और आउट-ऑफ-बैंड खाता सत्यापन के माध्यम से स्वयं को डीओएस आदि से बचाने पर विचार करता हूं।

+1

मैंने अपने खाली समय के दौरान इस परियोजना पर काम किया और दुर्भाग्य से मैंने इसे रोक दिया। मैंने ओथ 3-पैर का इस्तेमाल किया। इसे कार्यान्वित करना आसान नहीं था और चूंकि एपीआई निजी थी, वहां बुनियादी लाभों की तुलना मूलभूत + https + क्लाइंट प्रमाणपत्रों की तुलना में नहीं होती थी। मैंने इसे आजमाया नहीं है लेकिन आपका जवाब प्रश्न के सबसे महत्वपूर्ण भाग (oAuth के विकल्प) का जवाब देता है, इसलिए मैंने इसे स्वीकार कर लिया। धन्यवाद। –

3

क्या आपने पहले ही मूल प्रमाणीकरण का उपयोग करने पर विचार किया है?

मैंने अभी तक आपके द्वारा वर्णित ढांचे का उपयोग नहीं किया है, लेकिन मैंने web.py के आधार पर किसी ऐप में कुछ यूआरएल की रक्षा करने के लिए मूल लेख का उपयोग किया और ठीक काम किया।

असल में, आप बेस 64 में एक टोकन का उपयोग कर सकते हैं जो वास्तव में एक मानक http हेडर है।

हो सकता है कि इस उदाहरण आप मदद कर सकते हैं:

class Login: 

    def GET(self): 
     auth = web.ctx.env.get('HTTP_AUTHORIZATION') 
     authreq = False 
     if auth is None: 
      authreq = True 
     else: 
      auth = re.sub('^Basic ','',auth) 
      username,password = base64.decodestring(auth).split(':') 
      if (username,password) in settings.allowed: 
       raise web.seeother('/eai') 
      else: 
       authreq = True 
     if authreq: 
      web.header('WWW-Authenticate','Basic realm="Auth example"') 
      web.ctx.status = '401 Unauthorized' 
      return 
+1

आपके उत्तर के लिए टैंक, मैं आपकी भागीदारी की सराहना करता हूं :) लेकिन मूल या डाइजेस्ट प्रमाणीकरण के साथ बिल्कुल वही समस्याएं हैं। मैं उसी अनुरोध में उपयोगकर्ता और ग्राहक को प्रमाणित कैसे कर सकता हूं? –

0

यदि आप मूल प्रमाणीकरण में रुचि रखते हैं, तो यहां एक त्वरित विशेषता है जिसका उपयोग आप अपने हैंडलर http://www.varunpant.com/posts/basic-authentication-in-web-py-via-attribute को सजाने के लिए कर सकते हैं। यह उदाहरण मुख्य रूप से web.py संदर्भ में लिखा गया है, लेकिन मुझे लगता है कि इसे आसानी से tweaked किया जा सकता है।

def check_auth(username, password): 
    return username == 'username' and password == 'password' 


def requires_auth(f): 
    @wraps(f)  
    def decorated(*args, **kwargs):   
     auth = web.ctx.env['HTTP_AUTHORIZATION'] if 'HTTP_AUTHORIZATION' in web.ctx.env else None 
     if auth: 
      auth = re.sub('^Basic ', '', auth) 
      username, password = base64.decodestring(auth).split(':') 
     if not auth or not check_auth(username, password): 
      web.header('WWW-Authenticate', 'Basic realm="admin"') 
      web.ctx.status = '401 Unauthorized' 
      return 

     return f(*args, **kwargs) 

    return decorated 
0

यह थोड़ा देर हो सकता है लेकिन इससे मुझे बहुत मदद मिली। मूल रूप से बताते हैं कि कैसे सुरक्षा अमेज़न में काम करता है (वे OAuth का समर्थन नहीं करता)

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

के साथ अपनी समस्याओं में से एक के संबंध
+1

पढ़ने के लिए धन्यवाद, FYI oauth क्लाइंट को प्रमाणीकृत करने के लिए आपके लिंक (सार्वजनिक/निजी कुंजी हस्ताक्षर) पर वर्णित विधि का उपयोग कर रहा है। –