一、关于Basic Authentication
HTTP本身提供了一种基础的认证方式Basic Authentication,使得访问者在访问时需要输入账号密码认证之后才能访问到页面:
如果没有输入密码访问,服务器将会返回401
:
当服务端开启认证后,通过认证的方式有两种:
- 在访问URL的时候主动代码账号和密码信息,如http://user:password@www.baidu.com,其中
user
是账户名,password
是密码。 - 在请求头部加上
Authorization
头部,并将值设置为Basic xxxx
,xxxx是账号和密码的base64编码结果。
一般我们使用的是第二种方式:如果网站需要认证,浏览器会自动会弹出登录框,手动输入账号密码后浏览器在头部带上认证信息访问。以下是一个抓包示例:
最下面一行的Authorization是授权信息,最后的bWFxaWFuOnF3ZTEyMw==
即是经过base64加密后的账号密码。使用base64命令解码即可得到认证信息:
1 2 |
> printf "bWFxaWFuOnF3ZTEyMw==" | base64 -d maqian:qwe123 |
关于认证状态保持
浏览器如何做到保持状态的呢?根据抓包分析发现,认证成功后,浏览器会自动记住当前页面的账号信息。后续的每一个请求,浏览器都自动加上认证头部,无需每次都再输入账号密码,这样就达到了认证状态保持的效果。
二、使用nginx开启basic authentication
nginx默认提供了ngx_http_auth_basic_module模块以支持basic authentication,该指令为:
1 2 3 4 |
location / { auth_basic "auth test"; auth_basic_user_file conf/htpasswd; } |
其中auth_basic
认证信息的提示语句,他的值可以是一个字符串或者off,如果值是off表示访问无需认证,如果值是一个字符串,表示需要提供认证信息才能访问。并且大部分浏览器会把这个字符串返回到前端,测试发现chrome不会,edge会:
auth_basic_user_file
的值是密钥文件的路径,里面保存了所有的账号密码,内容格式为:
1 2 3 4 |
# comment name1:password1 name2:password2:comment name3:password3 |
nginx支持以下密码类型:
- encrypted with the
crypt()
function; can be generated using the “htpasswd
” utility from the Apache HTTP Server distribution or the “openssl passwd
” command; - hashed with the Apache variant of the MD5-based password algorithm (apr1); can be generated with the same tools;
- specified by the “
{scheme} data
” syntax (1.0.3+) as described in RFC 2307; currently implemented schemes includePLAIN
(an example one, should not be used),SHA
(1.3.13) (plain SHA-1 hashing, should not be used) andSSHA
(salted SHA-1 hashing, used by some software packages, notably OpenLDAP and Dovecot).
通常,我们可以使用htpasswd
和openssl
命令来生成密码,如:
1 2 |
> openssl passwd -crypt qwe123 # qwe123是生成的密码信息 wMEiqshd7n3YQ |
指令放置上下文
这个指令可以放置在:
1 |
http, server, location, limit_except |
评论