forward_auth
一个有见地的指令,它将请求的克隆代理到身份验证网关,该网关可以决定是否继续处理,或者需要发送到登录页面。
Caddy 的 reverse_proxy
能够对外部服务执行“预检查请求”,但此指令专门针对身份验证用例。此指令实际上只是使用更长、更常见的配置(如下)的便捷方式。
此指令向配置的上游发出 GET
请求,并重写 uri
- 如果上游以
2xx
状态代码响应,则授予访问权限,并将copy_headers
中的标头字段复制到原始请求,并继续处理。 - 否则,如果上游以任何其他状态代码响应,则将上游的响应复制回客户端。此响应通常应包含重定向到身份验证网关的登录页面。
如果此行为不是您想要的,您可以将下面的 扩展形式 作为基础,并根据您的需要对其进行自定义。
支持 reverse_proxy
的所有子指令,并传递给底层的 reverse_proxy
处理程序。
语法
forward_auth [<matcher>] [<upstreams...>] {
uri <to>
copy_headers <fields...> {
<fields...>
}
}
-
<upstreams...> 是发送身份验证请求的上游(后端)列表。
-
uri 是要设置到发送到上游的请求的 URI(路径和查询)。这通常是身份验证网关的验证端点。
-
copy_headers 是一个 HTTP 标头字段列表,当请求具有成功状态代码时,将从响应复制到原始请求。
可以使用
>
后跟新名称来重命名字段,例如Before>After
。如果需要可读性,可以使用块来列出所有字段,每行一个。
由于此指令是有见地的反向代理包装器,因此您可以使用任何 reverse_proxy
的子指令对其进行自定义。
扩展形式
forward_auth
指令与以下配置相同。像 Authelia 这样的身份验证网关与这种预设配合得很好。如果您的网关不兼容,请随意借用此配置并根据需要进行自定义,而不是使用 forward_auth
快捷方式。
reverse_proxy <upstreams...> {
# Always GET, so that the incoming
# request's body is not consumed
method GET
# Change the URI to the auth gateway's
# verification endpoint
rewrite <to>
# Forward the original method and URI,
# since they get rewritten above; this
# is in addition to other X-Forwarded-*
# headers already set by reverse_proxy
header_up X-Forwarded-Method {method}
header_up X-Forwarded-Uri {uri}
# On a successful response, copy response headers
@good status 2xx
handle_response @good {
request_header {
# for example, for each copy_headers field...
Remote-User {rp.header.Remote-User}
Remote-Email {rp.header.Remote-Email}
}
}
}
示例
Authelia
在通过反向代理提供您的应用程序之前,将身份验证委托给 Authelia
# Serve the authentication gateway itself
auth.example.com {
reverse_proxy authelia:9091
}
# Serve your app
app1.example.com {
forward_auth authelia:9091 {
uri /api/verify?rd=https://auth.example.com
copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
}
reverse_proxy app1:8080
}
有关更多信息,请参阅 Authelia 的文档,了解如何与 Caddy 集成。
Tailscale
将身份验证委托给 Tailscale(目前名为 nginx-auth
,但它仍然适用于 Caddy),并使用 copy_headers
的替代语法来重命名复制的标头(注意每个标头中的 >
)
forward_auth unix//run/tailscale.nginx-auth.sock {
uri /auth
header_up Remote-Addr {remote_host}
header_up Remote-Port {remote_port}
header_up Original-URI {uri}
copy_headers {
Tailscale-User>X-Webauth-User
Tailscale-Name>X-Webauth-Name
Tailscale-Login>X-Webauth-Login
Tailscale-Tailnet>X-Webauth-Tailnet
Tailscale-Profile-Picture>X-Webauth-Profile-Picture
}
}