HAProxy 从 cookie 设置授权 header
HAProxy set authorization header from cookie
我有一个我无法控制的后端,它使用魔术 links 工作。如果我使用魔法 link,我就不必登录。我想在不暴露实际密钥的情况下在外部共享魔法 link,因为密钥会不时更改,我希望使用 haproxy 作为反向代理。我不希望 link 对整个互联网开放,我也想使用基本身份验证。我面临的问题是后端覆盖了授权 header(魔术 link 需要它才能工作)并且我陷入循环并且每次都需要登录
我的解决方法:
- 在第一次请求时,我请求基本身份验证(有效)
- 然后我将它写入 cookie(这部分有效)
- 在每个后续请求中,如果 cookie 存在,我会读取 cookie 并将授权 header 设置为 cookie 值(这部分 不会 起作用)
- 然后我 运行 http_auth 我认为现在应该可以工作了,因为我已经覆盖了 header
但是不行。有什么建议吗?
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
我有一个我无法控制的后端,它使用魔术 links 工作。如果我使用魔法 link,我就不必登录。我想在不暴露实际密钥的情况下在外部共享魔法 link,因为密钥会不时更改,我希望使用 haproxy 作为反向代理。我不希望 link 对整个互联网开放,我也想使用基本身份验证。我面临的问题是后端覆盖了授权 header(魔术 link 需要它才能工作)并且我陷入循环并且每次都需要登录
我的解决方法:
- 在第一次请求时,我请求基本身份验证(有效)
- 然后我将它写入 cookie(这部分有效)
- 在每个后续请求中,如果 cookie 存在,我会读取 cookie 并将授权 header 设置为 cookie 值(这部分 不会 起作用)
- 然后我 运行 http_auth 我认为现在应该可以工作了,因为我已经覆盖了 header
但是不行。有什么建议吗?
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