2010-11-26 2 views
10

Ich stehe fest, versuchen, einen Python-basierten Webserver zu arbeiten.Bei Python HTTP Server mit Standard-Authentifizierung mit BaseHTTP stecken

Ich möchte Basic-Authentifizierung (Senden einer 401-Header) und authentifizieren mit einer Liste von Benutzern. Ich habe keine Probleme beim Senden der 401-Antwort mit "WWW-Authorize" -Header, ich kann die Benutzerantwort validieren (base64 codierte Benutzername & Passwort), jedoch erscheint die Login-Box nach erfolgreicher Validierung Pop-up.

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() 

Auf den ersten Last (http: // localhost: 10001) die loginbox erscheint, ich geben Sie Test, Test (der richtige Benutzer) Benutzer ok validiert, aber Feld erscheint wieder auf, wenn ich auf Abbrechen klicken, Ich komme auf die validierte Seite ...

Kann mir hier jemand helfen? Ich vermute, dass es etwas damit zu tun hat, dass die Autorisierung unter do_GET stattfindet, was jedes Mal ausgelöst wird, wenn eine Seite geladen wird.

Antwort

6

Das ist, weil Sie unbedingt 401 und WWW-Authenticate Header als Antwort senden. Sie müssen dies nur tun, wenn keine gültigen Authentifizierungsdaten in der Anforderung vorhanden sind. Wenn Sie mit der Anfrage zufrieden sind, senden Sie 200 (oder was auch immer) und fordern Sie die Authentifizierung nicht erneut an.

17

Versuchen Sie, diese für Größe:

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

brilliant! nett und einfach – Claudiu

Verwandte Themen