news 2026/11/6 0:14:44

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/11/3 2:05:56

Nginx 生成、配置SSL证书让浏览器信任证书

文章目录 1.生成SSL证书 1.1生成自签名证书(生成证书方式一)1.2.模拟CA机构方式生成证书(生成证书方式二,推荐) 3.1 生成 CA 的私钥ca.key和自签名证书ca.crt:3.2 生成服务器私钥 server.key:3.3 生成服务器证书请求文件server.csr&#xff…

作者头像 李华
网站建设 2026/11/3 2:05:57

如何查看电脑上是ros1还是ros2呢?

问题描述:如何查看电脑上是ros1还是ros2呢?问题解答:要查看你的电脑上安装的是 ROS 1 还是 ROS 2,可以通过以下几种方式来确认:1. 检查环境变量ROS 通常会在环境变量中设置一些标识,可以通过查看终端中的环…

作者头像 李华
网站建设 2026/11/3 8:18:31

net.sf.jsqlparser.statement.select.Select.getSelectBody()

1、问题原因 发生这个问题就是因为Pagehelper中jsqlparser和Mybatis-puls中jsqlparser冲突,以我的项目来说,我项目中的Pagehelper中jsqlparser版本为4.2而Mybatis-puls中jsqlparser的版本为4.9,就导致版本兼容问题 2、解决方法 如果你想以…

作者头像 李华
网站建设 2026/11/3 8:18:31

Nginx 安装及配置教程(Windows)【安装】

文章目录 一、 Nginx 下载 1. 官网下载2. 其它渠道 二、 Nginx 安装三、 配置四、 验证五、 其它问题 1. 常用命令2. 跨域问题 软件 / 环境安装及配置目录 一、 Nginx 下载 1. 官网下载 安装地址:https://nginx.org/en/download.html 打开浏览器输入网址 htt…

作者头像 李华
网站建设 2026/11/4 23:46:34

金运环球:被动卖压VS鸽派预期,非农前聚焦关键区间

【市场早间简述】大宗商品指数年度再平衡于昨日盘后正式启动,预计将产生显著被动抛压,昨日金银价格在抛压下V型反弹显示买盘支撑。地缘政治风险持续存在,叠加美联储官员鸽派表态强化降息预期,为市场提供中长期支撑。现货黄金与白银…

作者头像 李华
网站建设 2026/11/3 8:17:46

MySQL:顿悟了,添加索引时竟然不锁表?

一、前言 在 MySQL 数据库中,“锁表” 指的是对数据库表进行锁定,以控制对表中数据的并发访问。锁表是数据库管理系统(DBMS)用来维护数据一致性和完整性的一种机制。 当某个事务(Transaction)或操作需要对表…

作者头像 李华