2010-11-26 38 views
10

Estoy atascado tratando de hacer funcionar un servidor web basado en python.Atascado con servidor HTTP Python con autenticación básica con BaseHTTP

Quiero hacer Autenticación básica (envío de un encabezado 401) y autenticar en una lista de usuarios. No tengo problemas para enviar la respuesta 401 con el encabezado "WWW-Authorize", puedo validar la respuesta de los usuarios (contraseña codificada de base64 nombre de usuario &), sin embargo, el cuadro de inicio de sesión sigue apareciendo después de la validación exitosa.

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

Por primera carga (http: // localhost: 10001) el loginbox aparece, entro prueba, prueba (el usuario correcto) de usuario se valida bien, pero caja surge una copia de seguridad, si hago clic en cancelar, Llego a la página validada ...

¿Alguien puede echar una mano aquí? Sospecho que tiene algo que ver con el hecho de que la autorización se produce en do_GET, que se activa cada vez que se carga una página.

Respuesta

6

Eso es porque usted está enviando incondicionalmente 401 y WWW-Authenticate encabezado en respuesta. Solo necesita hacer esto cuando no hay credenciales de autenticación aceptables en la solicitud. Si está satisfecho con la solicitud, envíe 200 (o lo que corresponda) y no solicite autenticación nuevamente.

17

probar esto por tamaño:

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

brillante! agradable y simple – Claudiu

Cuestiones relacionadas