NGINX 能够对客户端进行身份验证。使用 NGINX 对客户端请求进行身份验证可以减轻服务器的工作负载,并能够阻止未经身份验证的请求到达应用服务器。NGINX 开源版模块包括基本身份验证和身份验证子请求。NGINX Plus 专有的 JSON Web Tokens(JWT)验证模块可与使用身份验证标准 OpenID Connect 的第三方身份验证提供商集成
本例子演示都是NGINX开源版
HTTP 基本身份验证
NGINX可以理解如下的密码格式:
user1:passwd1:comment #comment为可选的
user2:passwd2
user3:passwd3
复制
使用openssl passwd 对字符串进行加密:
1、安装openssl后,在命令行执行如下命令:
openssl passwd 'Test121$'
复制
2、在conf.d目录下创建passwd.txt,将用户名和密码写入,如图:
注:openssl passwd生成的密码是针对当前用户的,我在root下执行,因此用户就是root
3、编辑nginx.conf,给server模块添加认证,如图:
auth_basic:类似一个提示作用
auth_basic_user_file:指定密码文件位置
4、通过IP访问NGINX,提示输入账号密码,如图:
使用htpasswd来配置用户名和密码:
除了openssl passwd外,还可以使用htpasswd来设置用户名和密码
1、安装htpasswd,命令如下:
yum -y install apache2-utils #centos
apt install apache2-utils #ubuntu
复制
2、执行htpasswd命令生成用户名和密码文件,testuser是用户名,如图:
3、将/root/passwd.txt内容粘贴到conf.d/passwd.txt中,如图:
4、再次登录NGINX,提示输入用户名和密码,如图:
输入后即可登录到页面
注意:auth_basic认证可使用在http、server、location中,针对不同场景认证
身份验证内部子请求
通过第三方身份验证来对请求进行身份验证,需要用到的模块为http_auth_request_module,此模块默认不带,需要在编译安装的时候通过如下方式指定:
--with-http_auth_request_module #with前面是两个横岗
复制
1、在conf.d下定义auth.conf文件,内容如下:
auth_request:启用基于子请求结果的授权,设为off表示不启动,可配置在http、server、location中
auth_status: 保存认证请求的状态码,那就是/authservice的状态码
upstream_status:保存上游代理的返回状态码,也就是http://192.168.49.83:8989/auth返回的状态码
internal:只允许NGINX内部请求,不能通过外部请求
proxy_pass_request_body off:禁止将请求体传递给上游服务器
proxy_set_header Content-Length “”; 不将请求头内容传递给上游服务器
proxy_set_header X-Original-URI $request_uri; 自定义的 HTTP 头
X-Original-URI
,其值为当前请求的 URI(由变量$request_uri
表示)。$request_uri
变量包含了原始请求的 URI。通过设置这个头,你可以将原始请求的 URI 信息传递给上游服务器。这在调试或当后端服务需要知道原始请求路径时非常有用
原理:首先请求进来后,先到达子请求/authservice,子请求的认证服务为http://192.168.49.83:8989/auth,如果子请求返回的状态码为2xx,表示请求成功,然后继续后面的root /usr/share/nginx/html,如果返回3xx或者4xx等,则表示请求不成功,认证不通过
2、编辑auth_8989.conf文件,定义路由返回状态码为200,内容如下:
3、通过IP访问,如图:
4、修改第2步,将返回状态码修改为401,再次请求,如图:
从上图看出,当子请求返回状态码不是2xx的时候,认证就会失败