Skip to content

Commit ecb753d

Browse files
authored
Merge pull request #422 from MadAppGang/feature/exclude-auth-header
respect logger settings for auth headers
2 parents 099ae04 + 7e0c113 commit ecb753d

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

cmd/config-boltdb.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ services:
6161
region: ""
6262
login:
6363
loginWith:
64-
username: false
64+
username: true
6565
phone: true
6666
email: false
6767
federated: false
@@ -83,6 +83,9 @@ logger:
8383
# logs format (json, text)
8484
format: json
8585
# exclude body for HTTP requests that can contain sensitive data
86-
logSensitiveData: false
86+
logSensitiveData: true
8787
common:
8888
level: debug
89+
api:
90+
level: debug
91+
httpDetailing: dump

web/admin/router.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ func NewRouter(settings RouterSettings) (model.Router, error) {
5858
settings.LoggerSettings.DumpRequest,
5959
settings.LoggerSettings.Format,
6060
settings.LoggerSettings.Admin,
61+
settings.LoggerSettings.LogSensitiveData,
6162
settings.Cors)
6263

6364
ar.initRoutes()
@@ -70,6 +71,7 @@ func buildMiddleware(
7071
dumpRequest bool,
7172
format string,
7273
logParams model.LoggerParams,
74+
logSensitiveData bool,
7375
corsHandler *cors.Cors,
7476
) *negroni.Negroni {
7577
var handlers []negroni.Handler
@@ -79,6 +81,7 @@ func buildMiddleware(
7981
format,
8082
logParams,
8183
model.HTTPLogDetailing(dumpRequest, logParams.HTTPDetailing),
84+
!logSensitiveData,
8285
"/login",
8386
)
8487
handlers = append(handlers, lm)

web/api/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func buildBaseMiddleware(
8383
format,
8484
logParams,
8585
model.HTTPLogDetailing(dumpRequest, logParams.HTTPDetailing),
86+
!logSensitiveData,
8687
exclude...)
8788

8889
result := negroni.New(

web/management/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func (ar *Router) initRoutes(loggerSettings model.LoggerSettings) {
1818
loggerSettings.Format,
1919
loggerSettings.Management,
2020
model.HTTPLogDetailing(loggerSettings.DumpRequest, loggerSettings.Management.HTTPDetailing),
21+
!loggerSettings.LogSensitiveData,
2122
)
2223

2324
ar.router.Use(middleware.RequestID)

web/middleware/logger.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

web/spa/router.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func NewRouter(setting SPASettings, middlewares []negroni.Handler) (model.Router
2525
setting.LoggerSettings.DumpRequest,
2626
setting.LoggerSettings.Format,
2727
setting.LoggerSettings.SPA,
28+
!setting.LoggerSettings.LogSensitiveData,
2829
middlewares,
2930
)
3031

@@ -50,13 +51,15 @@ func buildMiddleware(
5051
dumpRequest bool,
5152
format string,
5253
logParams model.LoggerParams,
54+
logSensitiveData bool,
5355
middlewares []negroni.Handler,
5456
) *negroni.Negroni {
5557
lm := middleware.NegroniHTTPLogger(
5658
settingName,
5759
format,
5860
logParams,
5961
model.HTTPLogDetailing(dumpRequest, logParams.HTTPDetailing),
62+
!logSensitiveData,
6063
)
6164

6265
handlers := []negroni.Handler{

0 commit comments

Comments
 (0)