开始之前
在某些情况下,我们希望对服务器上的一些资源进行限制,例如服务器/api
路径下的所有资源,必须先进行身份验证然后才能访问资源,对于这个需求我们可以通过 HTTP Basic authentication 协议来完成,Nginx 使用 ngx_http_auth_basic_module
模块支持 HTTP基本身份验证 功能 。
HTTP基本身份验证
RFC 7235
定义了一个HTTP身份验证框架,服务器可以用来针对客户端的请求发送challenge(质询信息),客户端则可以用来提供身份验证凭证。
质询与应答的工作流程如下:
身份验证框架中最常用的HTTP认证方案是 "HTTP Basic authentication"(RFC 7617)。该方案中规定使用"用户的ID/密码"作为凭证信息,并且使用 base64
算法进行编码。由于用户 ID 与密码是是以明文的形式在网络中进行传输的(base64
可逆),所以基本验证方案并不安全,建议配合 HTTPS
协议使用。
配置步骤
1. nginx 配置文件
cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name www.demo.com;
#..其它配置项目省略
location ^~ /api {
auth_basic "authentication";
auth_basic_user_file conf.d/.htpasswd;
}
#..其它配置项目省略
}
2. 创建一个 htpasswd帐密文件
# 格式每行一个账户
用户名:密码
# nginx 可以直接使用 Apache 的 htpasswd命令创建的密码文件。
# 例如创建一个文件名为 htpasswd、帐号为 dongnan、密码为 zongming.net 。
htpasswd -bdc htpasswd dongnan zongming.net
如果没有 htpasswd
命令,也可以使用 openssl passwd
命令代替。
echo -n 'dongnan:' >> .htpasswd
openssl passwd -apr1 zongming.net >> .htpasswd
cat -A .htpasswd
dongnan:$apr1$nM8/P9Os$7hFSdSKCXejSxMYagNLYE/$
3. 重启 nginx
nginx -t && nginx reload
4. 验证
小结
最后来总结下文章中的知识点
- 使用 auth_basic 指令,启用 HTTP基本身份验证。
- 使用 auth_basic_user_file 指令, 指定帐密文件位置。
- 如果没有 Apache htpasswd 命令,可以使用 openssl 命令代替。
- HTTP基本身份验证,使用
base64
算法进行编码,并以明文的形式在网络中进行传输,建议配合HTTPS
协议使用。
参考
http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication