@@ -17,9 +17,10 @@ func NegroniHTTPLogger(
1717 format string ,
1818 logParams model.LoggerParams ,
1919 httpDetailing model.HTTPDetailing ,
20+ excludeAuth bool ,
2021 exclude ... string ,
2122) negroni.Handler {
22- logger := HTTPLogger (component , format , logParams , httpDetailing , exclude ... )
23+ logger := HTTPLogger (component , format , logParams , httpDetailing , excludeAuth , exclude ... )
2324
2425 return negroni .HandlerFunc (func (w http.ResponseWriter , r * http.Request , next http.HandlerFunc ) {
2526 logger (next ).ServeHTTP (w , r )
@@ -35,6 +36,7 @@ func HTTPLogger(
3536 format string ,
3637 logParams model.LoggerParams ,
3738 httpDetailing model.HTTPDetailing ,
39+ excludeAuth bool ,
3840 exclude ... string ,
3941) func (http.Handler ) http.Handler {
4042 if httpDetailing == model .HTTPLogNone ||
@@ -52,7 +54,7 @@ func HTTPLogger(
5254 logging .FieldComponent , component ,
5355 "method" , r .Method ,
5456 "url" , r .URL .String (),
55- "headers" , r .Header ,
57+ "headers" , redactHeaders ( r .Header , excludeAuth ) ,
5658 "body" , string (body ))
5759 }
5860
@@ -101,3 +103,45 @@ func HTTPLogger(
101103 hl := httplog .LoggerWithFormatterAndName (component , httplog .DefaultLogFormatterWithRequestHeadersAndBody )
102104 return hl
103105}
106+
107+ func redactHeaders (headers http.Header , excludeAuth bool ) http.Header {
108+ if ! excludeAuth {
109+ return headers
110+ }
111+
112+ result := make (http.Header , len (headers ))
113+
114+ for k , vv := range headers {
115+ if strings .EqualFold (k , "Authorization" ) {
116+ cc := make ([]string , len (vv ))
117+ for i , v := range vv {
118+ cc [i ] = redactAuthValue (v )
119+ }
120+ result [k ] = cc
121+ } else {
122+ result [k ] = vv
123+ }
124+
125+ }
126+
127+ return result
128+ }
129+
130+ func redactAuthValue (v string ) string {
131+ expectedPrefix := "bearer"
132+
133+ actualPrefix := ""
134+ if len (v ) >= len (expectedPrefix ) {
135+ actualPrefix = v [:len (expectedPrefix )]
136+ }
137+
138+ if strings .EqualFold (actualPrefix , expectedPrefix ) {
139+ if len (v ) <= len (expectedPrefix )+ 1 {
140+ return actualPrefix + " <empty>"
141+ }
142+
143+ return actualPrefix + " <redacted>"
144+ }
145+
146+ return "<redacted>"
147+ }
0 commit comments