HAProxy从Cookie设置Authorization Header解决基础认证循环问题求助
问题根因分析
- 核心错误1:Cookie读取逻辑错误
你配置的acl has_cookie req.hdr(X-MyAuth) -m found是从请求头中读取X-MyAuth字段,但你通过set-cookie写入的X-MyAuth是存储在Cookie请求头内,不是独立的请求头字段,所以这条ACL永远不触发,导致每次请求都需要重新走基础认证流程。 - 核心错误2:逻辑冗余混淆
前端基础认证使用的Authorization头和后端魔术链接需要的Authorization头是完全独立的两套体系,不需要将基础认证的凭证存入Cookie再回写为请求头,基础认证只用来校验用户访问权限,到后端转发阶段直接统一替换为魔术密钥即可。 - 次要错误:路径匹配不一致
frontend中配置的ACL是匹配/publiclink开头的路径,但backend中的路径替换规则是匹配/publiclink1,二者不一致会导致路径替换失效。
修正后的配置方案
userlist auth-list user myuser insecure-password mypass frontend myfrontend bind *:80 mode http acl is-public-path path -i -m beg /publiclink acl has-auth-cookie req.cook(auth_pass) -m str ok # 有认证Cookie直接跳过基础认证 http-request auth unless { has-auth-cookie or http_auth(auth-list) } # 认证通过后设置事务变量,用于后续种Cookie http-request set-var(txn.auth_success) str(ok) if { http_auth(auth-list) !has-auth-cookie } default_backend node backend node mode http server dcnode1 192.168.0.1:8000 check # 认证通过的首次请求种Cookie,有效期可按需加Max-Age http-response set-header Set-Cookie "auth_pass=ok; Path=/" if { var(txn.auth_success) -m found } # 统一修正路径替换规则,和frontend的路径匹配一致 http-request replace-path /publiclink(.*) /magiclink\1 # 统一设置后端需要的魔术链接Authorization头,和前端认证逻辑完全隔离 http-request set-header Authorization "Key magiclink"
调整说明
- 简化了认证逻辑,不再存储敏感的基础认证凭证到Cookie,仅用一个简单的状态标识判断是否已认证,安全性更高
- 修正了Cookie读取逻辑,使用
req.cook正确读取Cookie内的字段 - 完全拆分前端认证和后端魔术密钥两套逻辑,避免请求头互相覆盖
- 修正了路径匹配的笔误,保证路径转发正常
内容的提问来源于stack exchange,提问作者elmalto
相关产品推荐
相关产品推荐

