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