HTTP Basic Auth 小实验

在 Postman 里面看到了一堆的 Auth 方式:

HTTP Basic 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,大概就是说这是块什么“区域”,浏览器中的显示如下:

HTTP Basic Auth 小实验

(这里先不去测试不同的路径的登录和返回的 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 就好了,抓到的效果如下:

HTTP Basic Auth 小实验

参考

相关推荐