文档
一个 项目,由 ZeroSSL 赞助

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 {
		# for example, for each copy_headers field...
		request_header Remote-User {rp.header.Remote-User}
		request_header 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/authz/forward-auth
		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
	}
}