网页认证之 NginxAuthBasic

2019-02-01 1837点热度 0人点赞

当我们有一个页面需求访问认证,我们就可以用 AuthBasic 来进行访问控制


1 、说明

HTTP Basic authentication  是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。

一份标准的 HTTP Basic authentication 流程顺序

客户端请求一个需要身份认证的页面,但是没有提供用户名和口令。这通常是用户在地址栏输入一个 URL,或是打开了一个指向该页面的链接。
服务端响应一个 401 应答码,并提供一个认证域。
接到应答后,客户端显示该认证域(通常是所访问的计算机或系统的描述)给用户并提示输入用户名和口令。此时用户可以选择确定或取消。
用户输入了用户名和口令后,客户端软件会在原先的请求上增加认证消息头(值是 base64encode(username+":"+password)),然后重新发送再次尝试。
在本例中,服务器接受了该认证屏幕并返回了页面。如果用户凭据非法或无效,服务器可能再次返回 401 应答码,客户端可以再次提示用户输入口令。

由于 http 协议中的认证是将此字段通过 base64 编码发送给服务器,和明文无异,所以推荐在 https 中使用保证密码安全。

同时由于认证页面通过 401 错误返回给客户端实现的客户端输入账号密码,所以如果 401 错误被劫持也将无效。

在 Nginx 上我们可以调用 ngx_http_auth_basic 模块实现 HTTP Basic authentication

项目地址 http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html


2.1 、生成密码库文件

我们可以使用系统自带的 openssl 生成密码库的密码

生成一份用户到文件

echo echo -n 'username' >> example.passwd
echo echo -n ':' >> example.passwd

生成一份上方用户的密码到文件

openssl passwd -apr1 >> example.passwd

如果你想使用 Apache 的工具生成基于 crypt() 加密的密码文件,你可以换一种方式

安装 httpd-tools

yum install httpd-tools -y

创建一个基于 MD5 的密码算法 (apr1) 的密码库,并添加第一个用户

tpasswd -cm example.passwd username

创建一个基于 crypt() 加密的密码库,并添加第一个用户

htpasswd -cd example.passwd username

向密码库添加指定用户 ( 基于 crypt() 加密 )

htpasswd -d example.passwd username

向密码库添加指定用户 (基于 MD5 的密码算法 (apr1) )

htpasswd -d example.passwd username

向密码库删除指定用户

htpasswd -D example.passwd username

2.2 、查看密码库文件

基于 crypt() 加密

cat example.passwd

username:s38G5ylgQ1RHs
example:nEuLZWP0E3cqc

基于 MD5 的密码算法 (apr1)

cat example.passwd

username:$apr1$3xL2BP50$fpSrGy.zxithfOOQiVvFX.
example:$apr1$k3MJ7Aia$ERA4kJxUVkTf3D1p.Qxh..

2.3 、添加 nginx 配置

主要的添加内容就两个,其中 auth_basic 为自定义显示字段。

auth_basic "Nginx_Http_Auth_Basic";
auth_basic_user_file /etc/nginx/conf.d/example.passwd;

如果你想针对某个文件,你可以这样配置

location = /example/example.json {
    auth_basic "Nginx_Http_Auth_Basic";
    auth_basic_user_file /etc/nginx/conf.d/example.passwd;
}

如果你想针对某个目录,你可以这样配置

location ~* /data/auth/ {
    auth_basic "Nginx_Http_Auth_Basic";
    auth_basic_user_file /etc/nginx/conf.d/example.passwd;
}

3 、生成数据库的 Shell 脚本

下面是本人写的一个添加用户脚本。

#!/bin/bash
echo "Create Nginx Auth Passwd"
echo "------------------------"
echo "                        "
echo "      @StarryVoid       "
echo "   Use 'quit' to Stop   "
echo "                        "
echo "------------------------"
read -p "OutputFileName:" outputfilename
while true
do
    echo "------------------------"
    read -p "Username:" username
    if [ ! ${username} ] ; then echo "Please Input A Username" && continue ; fi
    if [ "${username}" = "quit" ] ; then break ; else echo -n ${username}':' >> ${outputfilename} ; fi
    openssl passwd -apr1 >> ${outputfilename}
    if [ $? -ne 0 ] ; then sed -i '$d' ${outputfilename} ; fi
    echo "------------------------"
done

4 、用户使用方法

浏览器用户使用时参考上方的 "HTTP Basic authentication 流程顺序"

绝大多数平台都通用的使用方法

https://username:[email protected]/example/

wget 命令使用方法可以

wget --http-user=username --http-passwd=password https://example.com/example/

curl 命令使用方法可以

curl -u username:password -O https://example.com/example/

StarryVoid

Have a good time