app/vmauth: accept requests with Basic Auth username which is equal to bearer_token value from the -auth.config

This commit is contained in:
Aliaksandr Valialkin 2021-11-17 13:31:16 +02:00
parent 5610207549
commit 67676880b3
No known key found for this signature in database
GPG key ID: A72BEC6CD3D0DED1
4 changed files with 47 additions and 4 deletions

View file

@ -43,6 +43,7 @@ Each `url_prefix` in the [-auth.config](#auth-config) may contain either a singl
users: users:
# Requests with the 'Authorization: Bearer XXXX' header are proxied to http://localhost:8428 . # Requests with the 'Authorization: Bearer XXXX' header are proxied to http://localhost:8428 .
# For example, http://vmauth:8427/api/v1/query is proxied to http://localhost:8428/api/v1/query # For example, http://vmauth:8427/api/v1/query is proxied to http://localhost:8428/api/v1/query
# Requests with the Basic Auth username=XXXX are proxied to http://localhost:8428 as well.
- bearer_token: "XXXX" - bearer_token: "XXXX"
url_prefix: "http://localhost:8428" url_prefix: "http://localhost:8428"

View file

@ -276,9 +276,12 @@ func parseAuthConfig(data []byte) (map[string]*UserInfo, error) {
if byUsername[ui.Username] { if byUsername[ui.Username] {
return nil, fmt.Errorf("duplicate username found; username: %q", ui.Username) return nil, fmt.Errorf("duplicate username found; username: %q", ui.Username)
} }
authToken := getAuthToken(ui.BearerToken, ui.Username, ui.Password) at1, at2 := getAuthTokens(ui.BearerToken, ui.Username, ui.Password)
if byAuthToken[authToken] != nil { if byAuthToken[at1] != nil {
return nil, fmt.Errorf("duplicate auth token found for bearer_token=%q, username=%q: %q", authToken, ui.BearerToken, ui.Username) return nil, fmt.Errorf("duplicate auth token found for bearer_token=%q, username=%q: %q", ui.BearerToken, ui.Username, at1)
}
if byAuthToken[at2] != nil {
return nil, fmt.Errorf("duplicate auth token found for bearer_token=%q, username=%q: %q", ui.BearerToken, ui.Username, at2)
} }
if ui.URLPrefix != nil { if ui.URLPrefix != nil {
if err := ui.URLPrefix.sanitize(); err != nil { if err := ui.URLPrefix.sanitize(); err != nil {
@ -318,11 +321,23 @@ func parseAuthConfig(data []byte) (map[string]*UserInfo, error) {
ui.requests = metrics.GetOrCreateCounter(fmt.Sprintf(`vmauth_user_requests_total{username=%q}`, name)) ui.requests = metrics.GetOrCreateCounter(fmt.Sprintf(`vmauth_user_requests_total{username=%q}`, name))
byUsername[ui.Username] = true byUsername[ui.Username] = true
} }
byAuthToken[authToken] = ui byAuthToken[at1] = ui
byAuthToken[at2] = ui
} }
return byAuthToken, nil return byAuthToken, nil
} }
func getAuthTokens(bearerToken, username, password string) (string, string) {
if bearerToken != "" {
// Accept the bearerToken as Basic Auth username with empty password
at1 := getAuthToken(bearerToken, "", "")
at2 := getAuthToken("", bearerToken, "")
return at1, at2
}
at := getAuthToken("", username, password)
return at, at
}
func getAuthToken(bearerToken, username, password string) string { func getAuthToken(bearerToken, username, password string) string {
if bearerToken != "" { if bearerToken != "" {
return "Bearer " + bearerToken return "Bearer " + bearerToken

View file

@ -290,6 +290,32 @@ users:
}, },
}, },
}, },
getAuthToken("", "foo", ""): {
BearerToken: "foo",
URLMap: []URLMap{
{
SrcPaths: getSrcPaths([]string{"/api/v1/query", "/api/v1/query_range", "/api/v1/label/[^./]+/.+"}),
URLPrefix: mustParseURL("http://vmselect/select/0/prometheus"),
},
{
SrcPaths: getSrcPaths([]string{"/api/v1/write"}),
URLPrefix: mustParseURLs([]string{
"http://vminsert1/insert/0/prometheus",
"http://vminsert2/insert/0/prometheus",
}),
Headers: []Header{
{
Name: "foo",
Value: "bar",
},
{
Name: "xxx",
Value: "y",
},
},
},
},
},
}) })
} }

View file

@ -4,6 +4,7 @@
users: users:
# Requests with the 'Authorization: Bearer XXXX' header are proxied to http://localhost:8428 . # Requests with the 'Authorization: Bearer XXXX' header are proxied to http://localhost:8428 .
# For example, http://vmauth:8427/api/v1/query is proxied to http://localhost:8428/api/v1/query # For example, http://vmauth:8427/api/v1/query is proxied to http://localhost:8428/api/v1/query
# Requests with the Basic Auth username=XXXX are proxied to http://localhost:8428 as well.
- bearer_token: "XXXX" - bearer_token: "XXXX"
url_prefix: "http://localhost:8428" url_prefix: "http://localhost:8428"