在WSGI / Python中处理401和403

时间:2017-07-18 21:18:03

标签: python http http-authentication wsgiserver

我在Python中使用make_sever wsgiref.simple_server方法创建了一个WSGI服务器。以下是启动服务器的代码。

port = 5000
httpd = make_server("localhost", port, Request_Handler)
print "Started Sever on port", str(port)
try :
    httpd.serve_forever()
except KeyboardInterrupt :
    print "Server Closed"

这是我的Request_Handler函数

def Request_Handler(environ, start_response):
count = 0
if environ["PATH_INFO"] == "/" :
    response_body = "No authentication required on root page"
    status = "200 OK"
    response_headers = [('Content-Type', 'text/plain'),
                        ('Content-Length', str(len(response_body)))]
    start_response(status, response_headers)
    return [response_body]

elif environ["PATH_INFO"] == '/AM-PM' :
    if authentication(environ.get('HTTP_AUTHORIZATION')) :
        print "Structure of HTTP_AUTHORIZATION IS :"
        print environ.get("HTTP_AUTHORIZATION")
        start_response('200 OK', [('Content-Type', 'text/plain')])
        return ["Authentication valid"]
    else :
        start_response('401 Unauthorized',
                       [('Content-Type', 'text/html'),
                       ('WWW-Authenticate', 'Basic realm="Login"')])
        count = count + 1
        return ["Please Try Again"]
        if count == 3:
            start_response('403 FORBIDDEN', [('Content-Type', 'text/plain'),('WWW-Authenticate', 'Basic realm="Login"')])
            return ["Authentication is invalid"]

早些时候,在else块中我只使用了401响应并且它工作正常。每当有人输入错误的密码时。我再次询问用户名和密码。但是现在我想在3条路径之后。 403响应开始并返回Authentication is invalid

我想过使用count变量来计算无效请求的数量,一旦它增加到3,就会开始403响应。

但是,当我使用此代码时,不会询问用户名和密码,而是以Authentication is Valid的打印消息启动200响应,这不是我想要的。

我出错的任何建议

PS这是我使用的authentication函数

def authentication(header) :
if not header :
    return False
scheme, data = header.split(None, 1)
print "Scheme : ", scheme
print "Data : ", data
decoded = b64decode(data).decode('UTF-8')
print "Decoded : ", decoded
username, password = decoded.split(':', 1)
return username == password #True Statement 200 response will be started.

0 个答案:

没有答案