Merge pull request #11643 from mrsiano/generic_oauth

Pass configured/auth headers to a Datasource.
This commit is contained in:
Carl Bergquist
2018-06-21 14:21:59 +02:00
committed by GitHub
4 changed files with 63 additions and 0 deletions

View File

@@ -40,11 +40,14 @@ apiVersion: 1
# graphiteVersion: "1.1" # graphiteVersion: "1.1"
# tlsAuth: true # tlsAuth: true
# tlsAuthWithCACert: true # tlsAuthWithCACert: true
# httpHeaderName1: "Authorization"
# # <string> json object of data that will be encrypted. # # <string> json object of data that will be encrypted.
# secureJsonData: # secureJsonData:
# tlsCACert: "..." # tlsCACert: "..."
# tlsClientCert: "..." # tlsClientCert: "..."
# tlsClientKey: "..." # tlsClientKey: "..."
# # <openshift\kubernetes token example>
# httpHeaderValue1: "Bearer xf5yhfkpsnmgo"
# version: 1 # version: 1
# # <bool> allow users to edit datasources from the UI. # # <bool> allow users to edit datasources from the UI.
# editable: false # editable: false

View File

@@ -117,6 +117,28 @@ func (proxy *DataSourceProxy) addTraceFromHeaderValue(span opentracing.Span, hea
} }
} }
func (proxy *DataSourceProxy) useCustomHeaders(req *http.Request) {
decryptSdj := proxy.ds.SecureJsonData.Decrypt()
index := 1
for {
headerNameSuffix := fmt.Sprintf("httpHeaderName%d", index)
headerValueSuffix := fmt.Sprintf("httpHeaderValue%d", index)
if key := proxy.ds.JsonData.Get(headerNameSuffix).MustString(); key != "" {
if val, ok := decryptSdj[headerValueSuffix]; ok {
// remove if exists
if req.Header.Get(key) != "" {
req.Header.Del(key)
}
req.Header.Add(key, val)
logger.Debug("Using custom header ", "CustomHeaders", key)
}
} else {
break
}
index += 1
}
}
func (proxy *DataSourceProxy) getDirector() func(req *http.Request) { func (proxy *DataSourceProxy) getDirector() func(req *http.Request) {
return func(req *http.Request) { return func(req *http.Request) {
req.URL.Scheme = proxy.targetUrl.Scheme req.URL.Scheme = proxy.targetUrl.Scheme
@@ -146,6 +168,11 @@ func (proxy *DataSourceProxy) getDirector() func(req *http.Request) {
req.Header.Add("Authorization", util.GetBasicAuthHeader(proxy.ds.BasicAuthUser, proxy.ds.BasicAuthPassword)) req.Header.Add("Authorization", util.GetBasicAuthHeader(proxy.ds.BasicAuthUser, proxy.ds.BasicAuthPassword))
} }
// Lookup and use custom headers
if proxy.ds.SecureJsonData != nil {
proxy.useCustomHeaders(req)
}
dsAuth := req.Header.Get("X-DS-Authorization") dsAuth := req.Header.Get("X-DS-Authorization")
if len(dsAuth) > 0 { if len(dsAuth) > 0 {
req.Header.Del("X-DS-Authorization") req.Header.Del("X-DS-Authorization")

View File

@@ -12,6 +12,7 @@ import (
macaron "gopkg.in/macaron.v1" macaron "gopkg.in/macaron.v1"
"github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/log"
m "github.com/grafana/grafana/pkg/models" m "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
@@ -322,6 +323,37 @@ func TestDSRouteRule(t *testing.T) {
So(interpolated, ShouldEqual, "0asd+asd") So(interpolated, ShouldEqual, "0asd+asd")
}) })
Convey("When proxying a data source with custom headers specified", func() {
plugin := &plugins.DataSourcePlugin{}
encryptedData, err := util.Encrypt([]byte(`Bearer xf5yhfkpsnmgo`), setting.SecretKey)
ds := &m.DataSource{
Type: m.DS_PROMETHEUS,
Url: "http://prometheus:9090",
JsonData: simplejson.NewFromAny(map[string]interface{}{
"httpHeaderName1": "Authorization",
}),
SecureJsonData: map[string][]byte{
"httpHeaderValue1": encryptedData,
},
}
ctx := &m.ReqContext{}
proxy := NewDataSourceProxy(ds, plugin, ctx, "")
requestURL, _ := url.Parse("http://grafana.com/sub")
req := http.Request{URL: requestURL, Header: make(http.Header)}
proxy.getDirector()(&req)
if err != nil {
log.Fatal(4, err.Error())
}
Convey("Match header value after decryption", func() {
So(req.Header.Get("Authorization"), ShouldEqual, "Bearer xf5yhfkpsnmgo")
})
})
}) })
} }

View File

@@ -13,6 +13,7 @@ var defaults = {
access: 'proxy', access: 'proxy',
jsonData: {}, jsonData: {},
secureJsonFields: {}, secureJsonFields: {},
secureJsonData: {},
}; };
var datasourceCreated = false; var datasourceCreated = false;