HTTP Basic Auth 小实验
在 Postman 里面看到了一堆的 Auth 方式:
现在来看一下 Basic Auth。
思路
Basic Auth 是什么?
用 Flask 写一个 Basic Auth 的页面
用浏览器测试
用 curl 测试
用 Charles 抓包检测 HTTP 请求
实验一下 Auth 的过期
Basic Auth 是什么
如它的名字,是基础的验证,所以会比较简单
会直接把用户名、密码的信息放在请求的 Header 中
携带信息的时候是把用户名、密码简单的拼接 & base64 掉,主要是为了解决账号、密码中可能存在的编码问题
额外的好处是不会直接看到账号密码,但是本质还是明文传输账号、密码,所以如果不是 HTTPS 会很容易被监听到
每次请求都会携带这些信息,curl 需要加
-u, --user USER[:PASSWORD] Server user and password
来设置,浏览器应该会有个缓存
附 Python 里的 base64:
>>> base64.encodestring('clip:passwd') 'Y2xpcDpwYXNzd2Q=\n' >>> base64.decodestring('Y2xpcDpwYXNzd2Q=\n') 'clip:passwd'
Flask Basic Auth
参考官方的 snippet:HTTP Basic Auth | Flask (A Python Microframework)
可以运行的 Gist:basic auth demo - with flask
最关键的地方如下:
获得请求中的 Basic Auth 信息
auth = request.authorization auth.username auth.password
如果不通过验证返回需要 Basic Auth 登录的头
{'WWW-Authenticate': 'Basic realm="Login Required"'}
至于那个 realm
意思见这里:http - What is the "realm" in basic authentication - Stack Overflow,大概就是说这是块什么“区域”,浏览器中的显示如下:
(这里先不去测试不同的路径的登录和返回的 realm 的关系)
浏览器测试
通过测试发现登录一次之后到浏览器退出都会自动携带上那个 Basic Auth 的 Header。
用 curl 测试
$ curl http://127.0.0.1:5000/secret-page Could not verify your access level for that URL. You have to login with proper credentials%
curl 的 Basic Auth 参数:
-u, --user USER[:PASSWORD] Server user and password
$ curl -x http://localhost:8888 http://127.0.0.1:5000/secret-page -u admin:secret secret_page%
Charles 抓包
小笔记:curl proxy
curl 的时候只要额外加一个 -x http://localhost:8888
就好了,抓到的效果如下: