* OAuth: Forward id token to the data source
* Add tests
* Forward id token in legacy API
* Check if id_token is string or not
(cherry picked from commit becfd776c3)
This commit is contained in:
@@ -230,6 +230,11 @@ func (hs *HTTPServer) createRequest(ctx context.Context, ds *models.DataSource,
|
|||||||
if token := hs.OAuthTokenService.GetCurrentOAuthToken(ctx, query.User); token != nil {
|
if token := hs.OAuthTokenService.GetCurrentOAuthToken(ctx, query.User); token != nil {
|
||||||
delete(query.Headers, "Authorization")
|
delete(query.Headers, "Authorization")
|
||||||
query.Headers["Authorization"] = fmt.Sprintf("%s %s", token.Type(), token.AccessToken)
|
query.Headers["Authorization"] = fmt.Sprintf("%s %s", token.Type(), token.AccessToken)
|
||||||
|
|
||||||
|
idToken, ok := token.Extra("id_token").(string)
|
||||||
|
if ok && idToken != "" {
|
||||||
|
query.Headers["X-ID-Token"] = idToken
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -269,6 +269,11 @@ func (proxy *DataSourceProxy) director(req *http.Request) {
|
|||||||
if proxy.oAuthTokenService.IsOAuthPassThruEnabled(proxy.ds) {
|
if proxy.oAuthTokenService.IsOAuthPassThruEnabled(proxy.ds) {
|
||||||
if token := proxy.oAuthTokenService.GetCurrentOAuthToken(proxy.ctx.Req.Context(), proxy.ctx.SignedInUser); token != nil {
|
if token := proxy.oAuthTokenService.GetCurrentOAuthToken(proxy.ctx.Req.Context(), proxy.ctx.SignedInUser); token != nil {
|
||||||
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type(), token.AccessToken))
|
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type(), token.AccessToken))
|
||||||
|
|
||||||
|
idToken, ok := token.Extra("id_token").(string)
|
||||||
|
if ok && idToken != "" {
|
||||||
|
req.Header.Set("X-ID-Token", idToken)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -487,15 +487,22 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
|||||||
SignedInUser: &models.SignedInUser{UserId: 1},
|
SignedInUser: &models.SignedInUser{UserId: 1},
|
||||||
Context: &web.Context{Req: req},
|
Context: &web.Context{Req: req},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
token := &oauth2.Token{
|
||||||
|
AccessToken: "testtoken",
|
||||||
|
RefreshToken: "testrefreshtoken",
|
||||||
|
TokenType: "Bearer",
|
||||||
|
Expiry: time.Now().AddDate(0, 0, 1),
|
||||||
|
}
|
||||||
|
extra := map[string]interface{}{
|
||||||
|
"id_token": "testidtoken",
|
||||||
|
}
|
||||||
|
token = token.WithExtra(extra)
|
||||||
mockAuthToken := mockOAuthTokenService{
|
mockAuthToken := mockOAuthTokenService{
|
||||||
token: &oauth2.Token{
|
token: token,
|
||||||
AccessToken: "testtoken",
|
|
||||||
RefreshToken: "testrefreshtoken",
|
|
||||||
TokenType: "Bearer",
|
|
||||||
Expiry: time.Now().AddDate(0, 0, 1),
|
|
||||||
},
|
|
||||||
oAuthEnabled: true,
|
oAuthEnabled: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
var routes []*plugins.Route
|
var routes []*plugins.Route
|
||||||
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
|
||||||
dsService := datasources.ProvideService(bus.New(), nil, secretsService)
|
dsService := datasources.ProvideService(bus.New(), nil, secretsService)
|
||||||
@@ -507,6 +514,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
|||||||
proxy.director(req)
|
proxy.director(req)
|
||||||
|
|
||||||
assert.Equal(t, "Bearer testtoken", req.Header.Get("Authorization"))
|
assert.Equal(t, "Bearer testtoken", req.Header.Get("Authorization"))
|
||||||
|
assert.Equal(t, "testidtoken", req.Header.Get("X-ID-Token"))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("When SendUserHeader config is enabled", func(t *testing.T) {
|
t.Run("When SendUserHeader config is enabled", func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user