欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tornado 实现 HTTP 基本认证

程序员文章站 2024-02-09 16:07:22
...

HTTP 基本认证的过程:

1.客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:

Get /index.html HTTP/1.0 
Host:www.google.com 

2. 服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:

HTTP/1.0 401 Unauthorised 
Server: SokEvo/1.0 
WWW-Authenticate: Basic realm=”google.com” 
Content-Type: text/html 
Content-Length: xxx 

3. 当符合 http1.0 或 1.1 规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
4. 用户输入用户名和密码后,将用户名及密码以 BASE64 加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:

Get /index.html HTTP/1.0 
Host:www.google.com 
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 注:xxxx….表示加密后的用户名及密码。 

5. 服务器收到上述请求信息后,将 Authorization 字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        auth_header = self.request.headers.get('Authorization', None)
        if auth_header is not None:
            auth_mode, auth_base64 = auth_header.split(' ', 1)
            auth_username, auth_password = auth_base64.decode('base64').split(':', 1)
            if auth_username == 'hello' and auth_password == 'world':
                self.write('ok')
            else:
                self.write('fail')
        else:
            '''
            HTTP/1.1 401 Unauthorized
            WWW-Authenticate: Basic realm="renjie"
            '''
            self.set_status(401)
            self.set_header('WWW-Authenticate', 'Basic realm="%s"' % 'hello')

使用 curl 测试

curl  -u hello:world http://127.0.0.1:8888/

输出:

ok