ドキュメント
プロジェクト

forward_auth

リクエストのクローンを認証ゲートウェイにプロキシする、独自のディレクティブです。認証ゲートウェイは、処理を続行するか、ログインページに送信する必要があるかを決定できます。

Caddyのreverse_proxyは、外部サービスへの「事前チェックリクエスト」を実行できますが、このディレクティブは認証ユースケースに特化して調整されています。このディレクティブは、実際には、より長く、より一般的な構成(下記)を使用するための便利な方法です。

このディレクティブは、設定されたアップストリームにuriを書き換えてGETリクエストを行います

  • アップストリームが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です。

    読みやすくするために、ブロックを使用して、すべてのフィールドを1行に1つずつリストすることもできます。

このディレクティブはリバースプロキシに対する独自のラッパーであるため、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
}

詳細については、Caddyとの統合に関するAutheliaのドキュメントを参照してください。

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
	}
}