2010-11-26 14 views
10

का उपयोग कर मूल प्रमाणीकरण के साथ पायथन HTTP सर्वर के साथ अटक गया मैं काम करने के लिए एक अजगर आधारित वेबसर्वर प्राप्त करने की कोशिश कर रहा हूं।बेसएचटीटीपी

मैं मूल प्रमाणीकरण (401 शीर्षलेख भेजना) और उपयोगकर्ताओं की सूची के विरुद्ध प्रमाणीकरण करना चाहता हूं। मुझे "डब्ल्यूडब्ल्यूडब्लू-प्राधिकृत" हेडर के साथ 401 प्रतिक्रिया भेजने में कोई परेशानी नहीं है, मैं उपयोगकर्ताओं की प्रतिक्रिया (बेस 64 एन्कोडेड उपयोगकर्ता नाम & पासवर्ड) को मान्य कर सकता हूं, हालांकि, लॉगिन सत्यापन सफल सत्यापन के बाद पॉप-अप रहता है।

import SimpleHTTPServer 
import SocketServer 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class Handler(BaseHTTPRequestHandler): 
    ''' Main class to present webpages and authentication. ''' 
    def do_HEAD(self): 
     print "send header" 
     self.send_response(401) 
     self.send_header('WWW-Authenticate', 'Basic realm=\"Test\"') 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     ''' Present frontpage with user authentication. ''' 
     self.do_HEAD() 

     if self.headers.getheader('Authorization') == None: 
      self.wfile.write('no auth header received') 
      pass 
     elif self.headers.getheader('Authorization') == 'Basic dGVzdDp0ZXN0': 
      self.wfile.write(self.headers.getheader('Authorization')) 
      self.wfile.write('authenticated!') 
      pass 
     else: 
      self.wfile.write(self.headers.getheader('Authorization')) 
      self.wfile.write('not authenticated') 
      pass 

httpd = SocketServer.TCPServer(("", 10001), Handler) 

httpd.serve_forever() 

if __name__ == '__main__': 
    main() 

पहले प्रस्तुत होने पर (http: // localhost: 10001) loginbox पॉप अप होता है, मैं में प्रवेश परीक्षण, परीक्षण (सही उपयोगकर्ता) उपयोगकर्ता ठीक मान्य है, लेकिन बॉक्स वापस पॉप अप होता है, अगर मैं रद्द करें क्लिक करें, मैं मान्य पृष्ठ पर जाता हूं ...

क्या कोई यहां हाथ उधार दे सकता है? मुझे संदेह है कि इस तथ्य के साथ कुछ करने के लिए कुछ है कि प्रमाणीकरण do_GET के अंतर्गत होता है, जो हर बार एक पेज लोड ट्रिगर होता है।

उत्तर

6

ऐसा इसलिए है क्योंकि आप बिना शर्त रूप से 401 और WWW-Authenticate शीर्षलेख भेज रहे हैं। अनुरोध में कोई स्वीकार्य प्रमाणीकरण प्रमाण-पत्र नहीं होने पर आपको केवल ऐसा करने की आवश्यकता है। यदि आप अनुरोध से संतुष्ट हैं, तो 200 (या जो भी उचित हो) भेजें और फिर प्रमाणीकरण का अनुरोध न करें।

17

आकार के लिए यह प्रयास करें:

import SimpleHTTPServer 
import SocketServer 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class Handler(BaseHTTPRequestHandler): 
    ''' Main class to present webpages and authentication. ''' 
    def do_HEAD(self): 
     print "send header" 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_AUTHHEAD(self): 
     print "send header" 
     self.send_response(401) 
     self.send_header('WWW-Authenticate', 'Basic realm=\"Test\"') 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     ''' Present frontpage with user authentication. ''' 
     if self.headers.getheader('Authorization') == None: 
      self.do_AUTHHEAD() 
      self.wfile.write('no auth header received') 
      pass 
     elif self.headers.getheader('Authorization') == 'Basic dGVzdDp0ZXN0': 
      self.do_HEAD() 
      self.wfile.write(self.headers.getheader('Authorization')) 
      self.wfile.write('authenticated!') 
      pass 
     else: 
      self.do_AUTHHEAD() 
      self.wfile.write(self.headers.getheader('Authorization')) 
      self.wfile.write('not authenticated') 
      pass 

httpd = SocketServer.TCPServer(("", 10001), Handler) 

httpd.serve_forever() 

if __name__ == '__main__': 
    main() 
+0

प्रतिभाशाली! अच्छा और सरल – Claudiu

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^