跳转至

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帐密文件

格式每行一个账户:

用户名:密码

可以使用 Apachehtpasswd命令创建的密码文件:

# 文件名为 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协议使用。

参考

回到页面顶部