[v10.1.x] Auth: id response header (#78883)

Auth: id response header (#77871)

* Add config options for identity id response header

* Add feature to add identity id response header to all responses

* Use util.SplitString

(cherry picked from commit 21f94c5b78)
This commit is contained in:
Karl Persson
2023-12-11 09:38:06 +01:00
committed by GitHub
parent 8f3cddbf65
commit a1408862dc
4 changed files with 77 additions and 0 deletions
@@ -249,6 +249,11 @@ func (h *ContextHandler) Middleware(next http.Handler) http.Handler {
}
}
if h.Cfg.IDResponseHeaderEnabled && reqContext.SignedInUser != nil {
namespace, id := getNamespaceAndID(reqContext.SignedInUser)
reqContext.Resp.Before(h.addIDHeaderEndOfRequestFunc(namespace, id))
}
next.ServeHTTP(w, r)
})
}
@@ -584,6 +589,42 @@ func (h *ContextHandler) initContextWithToken(reqContext *contextmodel.ReqContex
return true
}
// TODO(kalleep): Refactor to user identity.Requester interface and methods after we have backported this
func getNamespaceAndID(user *user.SignedInUser) (string, string) {
var namespace, id string
if user.UserID > 0 && user.IsServiceAccount {
id = strconv.Itoa(int(user.UserID))
namespace = "service-account"
} else if user.UserID > 0 {
id = strconv.Itoa(int(user.UserID))
namespace = "user"
} else if user.ApiKeyID > 0 {
id = strconv.Itoa(int(user.ApiKeyID))
namespace = "api-key"
}
return namespace, id
}
func (h *ContextHandler) addIDHeaderEndOfRequestFunc(namespace, id string) web.BeforeFunc {
return func(w web.ResponseWriter) {
if w.Written() {
return
}
if namespace == "" || id == "" {
return
}
if _, ok := h.Cfg.IDResponseHeaderNamespaces[namespace]; !ok {
return
}
headerName := fmt.Sprintf("%s-Identity-Id", h.Cfg.IDResponseHeaderPrefix)
w.Header().Add(headerName, fmt.Sprintf("%s:%s", namespace, id))
}
}
func (h *ContextHandler) deleteInvalidCookieEndOfRequestFunc(reqContext *contextmodel.ReqContext) web.BeforeFunc {
return func(w web.ResponseWriter) {
if h.features.IsEnabled(featuremgmt.FlagClientTokenRotation) {