Nginx可通过map或auth_request实现基于Token的API访问控制:map适用于静态Token轻量校验,auth_request推荐用于对接专用鉴权服务,配合limit_req防暴力探测,并需注意Header大小写、if滥用、JWT签名不可由Nginx验证等陷阱。

在 Nginx 中通过 location 块实现基于 Token 的 API 访问控制,核心思路是:利用 map 或 auth_request 模块解析并校验请求头(如 Authorization: Bearer xxx),再结合变量控制是否放行。Nginx 本身不直接验证 JWT 或自定义 Token 的签名,但可做轻量级前置拦截(如白名单、格式检查、简单密钥比对),复杂校验建议交由后端或专用鉴权服务。
使用 map + valid_referers 实现静态 Token 匹配
适用于测试环境或固定 Token 场景,不依赖外部服务:
- 在
http块中定义 Token 映射关系,将合法 Token 映射为 1,非法值映射为 0 - 利用
map提前提取请求头中的 Token,并做基础清洗(如去掉Bearer前缀) - 在
location中用if ($token_valid = 0) { return 401; }拦截
示例配置:
http {
map $http_authorization $token_valid {
default 0;
"~^Bearer\s+([a-zA-Z0-9_\-]+\.){2}[a-zA-Z0-9_\-]+$" 1; # 粗略匹配 JWT 格式
"~^Bearer\s+my-secret-token-2024$" 1;
}
<pre class="brush:php;toolbar:false;">server {
location /api/ {
if ($token_valid = 0) {
return 401 "Invalid or missing token\n";
}
proxy_pass https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e;
}
}}
用 auth_request 模块对接独立鉴权服务
生产推荐方式,把 Token 解析、签名验证、权限查询等逻辑下沉到专用服务(如 Flask/FastAPI 编写的 /auth/token 接口):
- 启用
auth_request模块(编译时需含--with-http_auth_request_module) - 在
location中设置auth_request /auth,Nginx 会以相同 headers 转发请求到本地或远程鉴权端点 - 鉴权服务返回 200 表示通过,401/403 拒绝,响应体可为空
- 支持透传用户信息(如
auth_request_set $user_id $upstream_http_x_user_id;)供后续使用
示例片段:
location /auth {
internal;
proxy_pass https://auth-service.example.com/validate;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
<p>location /api/users {
auth_request /auth;
auth_request_set $user_id $upstream_http_x_user_id;</p><pre class="brush:php;toolbar:false;">proxy_pass http://app;
proxy_set_header X-User-ID $user_id;}
结合 limit_req 防暴力探测 Token
Token 校验前若无速率限制,攻击者可能高频尝试猜测有效 Token:
- 在
http块中定义基于$http_authorization的限流区(注意避免哈希碰撞) - 对所有带 Authorization 头的请求统一限速,例如每分钟最多 5 次
- 与
auth_request配合,既防爆破又保主业务不受影响
limit_req_zone $http_authorization zone=auth_limit:10m rate=5r/m;
<p>server {
location /api/ {
limit_req zone=auth_limit burst=3 nodelay;
auth_request /auth;
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}
}</p>注意事项与常见陷阱
实际部署中容易忽略的关键点:
-
Header 大小写敏感:Nginx 中
$http_authorization对应请求头Authorization,不是authorization;确保客户端发送标准命名 -
if 是邪恶的:避免在
location外滥用if,尤其不要在server块顶层做 Token 判断;优先用map+auth_request - JWT 不宜在 Nginx 解析签名:Nginx 缺乏加密库,无法安全验证 RS256 等算法;仅做存在性/格式检查,签名必须由后端或专用服务完成
-
CORS 兼容性:若前端跨域调用,需确保预检请求(OPTIONS)不被 Token 规则拦截,可单独配置
location = /api/ { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin "*"; ... } }
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











