Nginx Http基本身份认证
2013-05-31 by dongnan
开始之前
在某些情况下,我们希望对服务器上的一些资源进行限制,例如服务器/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
协议使用。
配置步骤
配置 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;
}
#..其它配置项目省略
}
创建htpasswd帐密文件
格式每行一个账户:
用户名:密码
可以使用 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/$
重启nginx服务
nginx -t && nginx reload
验证
访问Nginx
,弹出认证:
小结
最后来总结下文章中的知识点:
- 使用
auth_basic
指令,启用HTTP
基本身份验证。 - 使用
auth_basic_user_file
指令, 指定帐密文件位置。 - 如果没有
Apache htpasswd
命令,可以使用openssl
命令代替。 - HTTP基本身份验证,使用
base64
算法进行编码,并以明文的形式在网络中进行传输,建议配合HTTPS
协议使用。