news 2026/1/15 5:30:02

Nginx auth_request详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx auth_request详解

网上看到多篇先关文章,觉得很不错,这里合并记录一下,仅供学习参考。

模块

nginx-auth-request-module

该模块是nginx一个安装模块,使用配置都比较简单,只要作用是实现权限控制拦截作用。默认高版本nginx(比如1.12)已经默认安装该模块,下面介绍下使用该模块实现多个站点之间的统一权限控制。

例子1

这里用一个例子来说明下,如下例子是包含site1(对应web1)、site2(对应web2)、auth(20.131:7001)在内的三个应用项目,auth项目主要做权限拦截,比如jwt校验等,site1、site2分别为两个受保护的资源站点,只有auth授权通过后才能访问该站点。

实现上述要求nginx配置详情如下(nginx地址为20.198):

upstream web1 { server 192.168.20.131:3000; } upstream web2 { server 192.168.20.131:3001; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } location /api/web1 { auth_request /auth; error_page 401 = @error401; auth_request_set $user $upstream_http_x_forwarded_user; proxy_set_header X-Forwarded-User $user; proxy_pass http://web1; } location /api/web2 { auth_request /auth; error_page 401 = @error401; auth_request_set $user $upstream_http_x_forwarded_user; proxy_set_header X-Forwarded-User $user; proxy_pass http://web2; } location /auth { internal; proxy_set_header Host $host; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_pass http://192.168.20.131:7001/auth; } location @error401 { add_header Set-Cookie "NSREDIRECT=$scheme://$http_host$request_uri;Path=/"; return 302 http://192.168.20.131:7001/login; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

配置好之后,要明白一点,那就是_nginx-auth-request-module_模块基本使用原理就是:

1、auth_request对应的路由返回401 or 403时,会拦截请求直接nginx返回前台401 or 403信息;

2、auth_request对应的路由返回2xx状态码时,不会拦截请求,而是构建一个subrequest请求再去请求真实受保护资源的接口;

所以,基于此,auth模块只需要校验然后返回相应的状态码即可实现权限拦截操作,简单测试如下:

auth代码:

// 授权认证接口 async auth() { console.log(Date.now()); this.ctx.status = 200; } // 失败后的登录页面 async login() { console.log('失败了........'); this.ctx.body = { msg: '授权失败', code: 10001 } }

这里的auth授权接口我们直接返回200,login是上述auth项目下配置的路由,用于授权失败后302至登录页面用的。

site1和site2代码相同,只罗列一个如下:

/* /api/web1/users,如果是web2则为/api/web2/users */ router.all('/', function(req, res, next) { res.send('respond with a resource from web1'); });

这里只是简单渲染输出一个字符串而已,测试如下:

浏览器访问:http://192.168.20.198/api/web1/users,输出:

改变auth接口如下:

// 授权认证接口 async auth() { console.log(Date.now()); this.ctx.status = 401; } // 失败后的登录页面 async login() { console.log('失败了........'); this.ctx.body = { msg: '授权失败', code: 10001 } }

这里将状态码改为了401,再次访问:http://192.168.20.198/api/web1/users,输出:

这里可以看到,浏览器直接进行了302跳转,因为鉴权失败,直接重定向到登录页面了。

以上就是关于_nginx-auth-request-module_模块的基本操作及配置,多个项目下部署统一的权限接口时还是相当有用的。

例子2

首先,确保Nginx已经安装并启用了auth_request模块。然后,编辑Nginx配置文件(通常是nginx.conf或某个虚拟主机配置文件)。

通过–with-http_auth_request_module添加auth_request模块

http {
# 定义认证服务的逻辑
server {
listen 127.0.0.1:8080;
location /auth {
# 此处为简单示例,实际应用中应调用外部认证服务
if ($http_authorization = “Basic dXNlcm5hbWU6cGFzc3dvcmQ=”) { # 假设认证使用Basic Auth
return 200;
}
return 401;
}
}

server {
listen 80;
server_name example.com;

location / {
# 使用 auth_request 调用认证服务
auth_request /auth;

# 处理认证服务的响应结果
error_page 401 = @error401;
error_page 403 = @error403;

# 正常处理请求
proxy_pass http://backend;
}

# 定义认证失败时的处理逻辑
location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

# 认证服务的代理设置
location /auth {
proxy_pass http://127.0.0.1:8080/auth;
proxy_pass_request_body off; # 不代理请求体到认证服务
proxy_set_header Content-Length “”;
proxy_set_header X-Original-URI $request_uri;
}
}
}

配置说明

定义认证服务:

server {
listen 127.0.0.1:8080;
location /auth {
if ($http_authorization = “Basic dXNlcm5hbWU6cGFzc3dvcmQ=”) {
return 200;
}
return 401;
}
}

这个server块模拟了一个简单的认证服务,它监听127.0.0.1:8080,根据请求头Authorization判断用户是否经过认证。在实际应用中,这个应该是一个调用外部服务的代理配置。

主站点配置:

server {
listen 80;
server_name example.com;

location / {
auth_request /auth;
error_page 401 = @error401;
error_page 403 = @error403;
proxy_pass http://backend;
}

location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

location /auth {
proxy_pass http://127.0.0.1:8080/auth;
proxy_pass_request_body off;
proxy_set_header Content-Length “”;
proxy_set_header X-Original-URI $request_uri;
}
}

  • auth_request /auth;:该指令告诉Nginx,在处理用户请求前,先将请求发送到/auth进行认证。
  • error_page 401 = @error401;和error_page 403 = @error403;:定义认证失败时的处理逻辑,将401或403错误重定向到相应的处理块。
  • proxy_pass http://backend;:成功认证后,将请求代理到后端服务器。
认证失败处理:

location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

认证失败时,根据实际情况返回401或403状态码,并附带相应的错误信息。

测试与验证

启动Nginx,尝试访问http://example.com,并使用不同的Authorization头部测试认证行为。如果头部包含正确的用户名和密码(在本例中为"Basic dXNlcm5hbWU6cGFzc3dvcmQ="),请求应被允许访问后端资源,否则返回相应的错误状态码。

例子3

upstream web1 {
server 192.168.20.131:3000;
}

upstream web2 {
server 192.168.20.131:3001;
}

location ^~ /session/ {

charset utf-8;
auth_request /session-backend-info/;
auth_request_set $backend $upstream_http_backend;

proxy_set_header Forwarded $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $remote_port;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_passb a c k e n d / backend/backend/request_uri;

}

$backend为web1、web2upstream

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/14 7:14:12

FORTIFY代码扫描:小白也能懂的安全入门

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向初学者的FORTIFY交互式学习平台,包含分步视频教程、模拟扫描环境和实时指导。平台应提供预设的漏洞代码示例,引导用户完成安装、配置、扫描、解…

作者头像 李华
网站建设 2026/1/15 1:52:34

“入职背景调查”,构建职场信任的第一道防线

当一份精心打磨的简历呈现在眼前,我们相信的,是文字本身,还是文字背后那个真实的职业生命?在充满机遇与不确定性的职场江湖,一次严谨的入职背景调查,已不仅是风险防范的程序,更是构建长期信任、…

作者头像 李华
网站建设 2026/1/14 15:35:56

陪诊小程序开发运营全解析:技术架构+落地逻辑+合规要点

老龄化加剧叠加异地就医需求增长,陪诊服务已成刚需,但行业普遍面临“服务无标准、调度效率低、隐私保护难”三大痛点。陪诊小程序作为数字化解决方案,能实现“用户便捷下单陪诊师高效接单平台合规管控”,但超60%的项目因技术支撑不…

作者头像 李华
网站建设 2026/1/15 7:52:59

Thinkphp-Laravel北京地铁票务APP小程序

目录ThinkPHP与Laravel框架的对比分析北京地铁票务APP小程序的核心功能技术实现关键点性能与安全优化实际应用场景项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理ThinkPHP与Laravel框架的对比分析 ThinkPHP作为国产轻量级框架,以简洁…

作者头像 李华
网站建设 2026/1/15 4:14:33

Thinkphp-Laravel本科生优秀作业交流网站vue

目录项目概述技术架构核心功能创新点应用价值项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理项目概述 Thinkphp-Laravel本科生优秀作业交流网站是一个基于前后端分离架构的学术资源共享平台,前端采用Vue.js框架实现动态交互&#xff…

作者头像 李华
网站建设 2026/1/14 15:31:50

2026年品牌排行榜:TOP5 EOR名义雇主人力资源解决方案推荐

在2026年品牌排行榜中,EOR名义雇主服务成为企业拓展国际市场的重要工具。通过这些服务,企业能够快速合规地雇佣全球人才,降低进入新市场的复杂性。这些解决方案为公司提供了高效的薪酬管理、合规事务处理和员工福利方案,确保企业在…

作者头像 李华