2010-11-26 8 views
10

PythonベースのWebサーバーを動作させようとしています。BaseHTTPを使用した基本認証を使用したPython HTTPサーバーに詰まっています

基本認証(401ヘッダーの送信)を行い、ユーザーの一覧に対して認証したいと考えています。 "WWW-Authorize"ヘッダーで401の応答を送信するのに問題はありませんが、ユーザーの応答(base64でエンコードされたユーザー名&のパスワード)を検証できますが、検証が成功した後もログインボックスがポップアップし続けます。最初のロードで

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がポップアップ、私はテスト、テスト(正しいユーザー)ユーザーが[OK]を検証される入力しますが、私キャンセル]をクリックするとボックスが、バックアップポップ、私は有効なページに行く...

誰もここに手を貸してくれますか?私はそれは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

関連する問題