HAProxy 从 cookie 设置授权 header

HAProxy set authorization header from cookie

我有一个我无法控制的后端,它使用魔术 links 工作。如果我使用魔法 link,我就不必登录。我想在不暴露实际密钥的情况下在外部共享魔法 link,因为密钥会不时更改,我希望使用 haproxy 作为反向代理。我不希望 link 对整个互联网开放,我也想使用基本身份验证。我面临的问题是后端覆盖了授权 header(魔术 link 需要它才能工作)并且我陷入循环并且每次都需要登录

我的解决方法:

但是不行。有什么建议吗?

userlist auth-list
  user myuser insecure-password mypass

frontend myfrontend
   bind *:80
   mode http
   acl is-path path -i -m beg /publiclink
   acl has_cookie req.hdr(X-MyAuth) -m found
   http-request set-header Authorization %[req.hdr(X-MyAuth)] if has_cookie
   http-request auth unless { http_auth(auth-list) }
   http-request set-var(txn.myhostheader) req.hdr(Authorization) if { http_auth(auth-list) !has_cookie }
   default_backend node

backend node
    mode http
    server dcnode1 192.168.0.1:8000 check
    http-response set-header set-cookie "X-MyAuth=%[var(txn.myhostheader)]; Path=/" if  { var(txn.myhostheader) -m found }
    http-request replace-path /publiclink1(.*) /magiclink
    http-request set-header Authorization "Key magiclink"

我的回答与这点有关:

  • 在每个后续请求中,如果 cookie 存在,我读取 cookie 并将授权 header 设置为 cookie 值(这部分不起作用)

在您的 后端 中,您设置 Set-Cookie: X-MyAuth=... header :

backend node
    http-response set-header set-cookie "X-MyAuth=%[var(txn.myhostheader)]; Path=/" if  { var(txn.myhostheader) -m found }

因此 下一个请求 包含一个 Cookie header 像这样:Cookie: .* X-MyAuth=.*.

但是在你的前端,你使用X-MyAuth header(可能不存在):

frontend myfrontend
   acl has_cookie req.hdr(X-MyAuth) -m found
   http-request set-header Authorization %[req.hdr(X-MyAuth)] if has_cookie

您可以像这样使用 X-MyAuth cookie 值 :

frontend myfrontend
   acl has_cookie cook(X-MyAuth) -m found
   http-request set-header Authorization %[cook(X-MyAuth)] if has_cookie