Pull the downstream headers from the comfig if provided

This commit is contained in:
Owen
2026-08-12 15:34:48 -04:00
parent f5000d8b18
commit f61e6c1cd4

56
main.go
View File

@@ -24,6 +24,12 @@ type Config struct {
TrustIP []string `json:"trustip,omitempty"`
DisableDefaultCFIPs bool `json:"disableDefaultCFIPs,omitempty"`
CustomIPHeader string `json:"customIPHeader,omitempty"`
RemoteUserIDHeader string `json:"remoteUserIdHeader,omitempty"`
RemoteVirtualApiKeyIDHeader string `json:"remoteVirtualApiKeyIdHeader,omitempty"`
RemoteUserHeader string `json:"remoteUserHeader,omitempty"`
RemoteEmailHeader string `json:"remoteEmailHeader,omitempty"`
RemoteNameHeader string `json:"remoteNameHeader,omitempty"`
RemoteRoleHeader string `json:"remoteRoleHeader,omitempty"`
}
const (
@@ -32,6 +38,13 @@ const (
xForwardProto = "X-Forwarded-Proto"
cfConnectingIP = "CF-Connecting-IP"
cfVisitor = "CF-Visitor"
defaultRemoteUserIDHeader = "Remote-User-Id"
defaultRemoteVirtualApiKeyIDHeader = "Remote-Virtual-Api-Key-Id"
defaultRemoteUserHeader = "Remote-User"
defaultRemoteEmailHeader = "Remote-Email"
defaultRemoteNameHeader = "Remote-Name"
defaultRemoteRoleHeader = "Remote-Role"
)
type Badger struct {
@@ -46,6 +59,19 @@ type Badger struct {
disableForwardAuth bool
trustIP []*net.IPNet
customIPHeader string
remoteUserIDHeader string
remoteVirtualApiKeyIDHeader string
remoteUserHeader string
remoteEmailHeader string
remoteNameHeader string
remoteRoleHeader string
}
func stringOrDefault(value, def string) string {
if value == "" {
return def
}
return value
}
type VerifyBody struct {
@@ -116,6 +142,12 @@ func New(ctx context.Context, next http.Handler, config *Config, name string) (h
accessTokenHeader: config.AccessTokenHeader,
disableForwardAuth: config.DisableForwardAuth,
customIPHeader: config.CustomIPHeader,
remoteUserIDHeader: stringOrDefault(config.RemoteUserIDHeader, defaultRemoteUserIDHeader),
remoteVirtualApiKeyIDHeader: stringOrDefault(config.RemoteVirtualApiKeyIDHeader, defaultRemoteVirtualApiKeyIDHeader),
remoteUserHeader: stringOrDefault(config.RemoteUserHeader, defaultRemoteUserHeader),
remoteEmailHeader: stringOrDefault(config.RemoteEmailHeader, defaultRemoteEmailHeader),
remoteNameHeader: stringOrDefault(config.RemoteNameHeader, defaultRemoteNameHeader),
remoteRoleHeader: stringOrDefault(config.RemoteRoleHeader, defaultRemoteRoleHeader),
}
// Validate required fields only if forward auth is enabled
@@ -284,12 +316,12 @@ func (p *Badger) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
return
}
req.Header.Del("Remote-User")
req.Header.Del("Remote-Email")
req.Header.Del("Remote-Name")
req.Header.Del("Remote-Role")
req.Header.Del("Remote-User-Id")
req.Header.Del("Remote-Virtual-Api-Key-Id")
req.Header.Del(p.remoteUserHeader)
req.Header.Del(p.remoteEmailHeader)
req.Header.Del(p.remoteNameHeader)
req.Header.Del(p.remoteRoleHeader)
req.Header.Del(p.remoteUserIDHeader)
req.Header.Del(p.remoteVirtualApiKeyIDHeader)
if result.Data.ResponseHeaders != nil {
for key, value := range result.Data.ResponseHeaders {
@@ -332,27 +364,27 @@ func (p *Badger) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
}
if result.Data.UserId != nil {
req.Header.Add("Remote-User-Id", *result.Data.UserId)
req.Header.Add(p.remoteUserIDHeader, *result.Data.UserId)
}
if result.Data.Username != nil {
req.Header.Add("Remote-User", *result.Data.Username)
req.Header.Add(p.remoteUserHeader, *result.Data.Username)
}
if result.Data.Email != nil {
req.Header.Add("Remote-Email", *result.Data.Email)
req.Header.Add(p.remoteEmailHeader, *result.Data.Email)
}
if result.Data.Name != nil {
req.Header.Add("Remote-Name", *result.Data.Name)
req.Header.Add(p.remoteNameHeader, *result.Data.Name)
}
if result.Data.Role != nil {
req.Header.Add("Remote-Role", *result.Data.Role)
req.Header.Add(p.remoteRoleHeader, *result.Data.Role)
}
if result.Data.VirtualApiKeyId != nil {
req.Header.Add("Remote-Virtual-Api-Key-Id", *result.Data.VirtualApiKeyId)
req.Header.Add(p.remoteVirtualApiKeyIDHeader, *result.Data.VirtualApiKeyId)
}
if !result.Data.DontStripSession {