HTTP – Basic Authorization

HTTP 基本认证中,web 服务器拒绝一个事务,质询客户端,请用户提供有效的用户名和密码。同时,返回 401 状态码,并用 WWW-Authenticate 响应首部指定要访问的安全域(realm)。然后,客户端用 Authorization 请求首部发送经过 base64 加密之后的用户名密码(用户名:密码)给服务器。

Nginx 搭建 HTTP Basic Authorization

Nginx ngx_http_auth_basic_module 可以实现 HTTP Basic Authorization 协议。

location / {
    auth_basic 'authorization';
    auth_basic_user_file conf/htpasswd;
}
  • auth_basic: string | off,默认 off,不开启。开启 HTTP Basic Authorization 只需要填写一个字符串,该字符串会作为 realm 的值,在服务器质询客户端的返回头部信息 WWW-Authenticate 中显示,如:WWW-Authenticate: Basic realm="Authorication"

  • auth_basic_user_file: 指定访问的用户名和密码的配置文件,如,htpasswd

    # comment
    name1:password1
    name2:password2:comment
    
    • 可以用 # 注释
    • 可以设置多个用户名和密码,每行一个,用户名和密码之间用 : 隔开,注释也可以写在密码后面,用 : 隔开。
    • 用户名直接填写,但是密码需要经过加密。如,Linux 系统,密码 123456 可以用 openssl passwd 123456 生成。

假设,刚刚搭建的服务器地址为:127.0.0.1。从浏览器访问 http://127.0.0.1 就会收到一个 401 质询,弹出一个用户名和密码的输入框。用户输入账号和密码之后,浏览器会用 : 将其连接起来,编成 base64 编码,然后将其放在请求头部的 Authorization 中发送给服务端。服务端验证通过后就可以正常浏览页面的内容了。

HTTP 基础认证过程

假如,nginx 配置好的认证页面为 http://127.0.0.1

  • telnet 建立一条 http 连接
telnet 127.0.0.1 80
  • 发送正常的请求,会返回 401
HEAD / HTTP/1.1
Host: 172.16.105.114

HTTP/1.1 401 Unauthorized
Server: BDSCAN/1.5.0
Date: Wed, 17 Jan 2018 08:26:04 GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="authorization"
  • 发送带验证信息的请求
HEAD / HTTP/1.1
Host: 172.16.105.114
Authorization: Basic bGl6czoxMjM0NTY=

HTTP/1.1 200 OK
Server: BDSCAN/1.5.0
Date: Wed, 17 Jan 2018 08:26:59 GMT
Content-Type: text/html
Content-Length: 334
Last-Modified: Tue, 16 Jan 2018 08:55:10 GMT
Connection: keep-alive
ETag: "5a5dbdee-14e"
Accept-Ranges: bytes

验证信息放在请求头的 Authorization,即 Authorization: Basic base64-username-and-passwordbase64-username-and-password 为用户名和密码用 : 连接起来,并经过 base64 编码等到的字符串 (即上面的 bGl6czoxMjM0NTY=) 。Python(python2) 生成:

import base64

username = 'lizs'
password = '123456'
msg = base64.b64encode('%s:%s' % (username, password))