6bb7ab261a
* Stub out frontend user auth * Stub out backend user auth * Add context * Reorganise files * Refactor app registration form * Alert for user auth service principal credentials * AzureMonitor: Add flag for enabling/disabling fallback credentials for current user authentication (#82332) * Rename field * Add fallback setting * Update tests and mock * Remove duplicate setting line * Update name of property * Update frontend settings * Update docs and default config files * Update azure-sdk * Fix lint * Update test * Bump dependency * Update configuration * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Christopher Moyer <35463610+chri2547@users.noreply.github.com> * Docs review * AzureMonitor: User authentication frontend updates (#83107) * Rename field * Add fallback setting * Update tests and mock * Remove duplicate setting line * Update name of property * Update frontend settings * Update docs and default config files * Add alerts to query editor - Add authenticatedBy property to grafana/data - Update mocks - Update query editor to disable it under certain circumstances - Update tests * Add separate FallbackCredentials component - Reset AppRegistrationCredentials component to only handle clientsecret credentials - Update AzureCredentialsForm - Update selectors - Update tests - Update credentials utility functions logic * Alert when fallback credentials disabled * Update condition * Update azure-sdk * Fix lint * Update test * Remove unneeded conditions * Set auth type correctly * Legacy cloud options * Fix client secret * Remove accidental import * Bump dependency * Add tests * Don't use VerticalGroup component * Remove unused import * Fix lint * Appropriately set oAuthPassThru and disableGrafanaCache properties * Clear azureCredentials on authType change * Correctly retrieve secret * Fix bug in authTypeOptions * Update public/app/plugins/datasource/azuremonitor/components/ConfigEditor/CurrentUserFallbackCredentials.tsx Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> * Update public/app/plugins/datasource/azuremonitor/components/QueryEditor/QueryEditor.tsx Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> * Update public/app/plugins/datasource/azuremonitor/components/ConfigEditor/CurrentUserFallbackCredentials.tsx Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> * Add documentation links * Fix broken link --------- Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> * AzureMonitor: Update docs for current user authentication (#83440) * Rename field * Add fallback setting * Update tests and mock * Remove duplicate setting line * Update name of property * Update frontend settings * Update docs and default config files * Add alerts to query editor - Add authenticatedBy property to grafana/data - Update mocks - Update query editor to disable it under certain circumstances - Update tests * Add separate FallbackCredentials component - Reset AppRegistrationCredentials component to only handle clientsecret credentials - Update AzureCredentialsForm - Update selectors - Update tests - Update credentials utility functions logic * Alert when fallback credentials disabled * Update condition * Update azure-sdk * Fix lint * Update test * Remove unneeded conditions * Set auth type correctly * Legacy cloud options * Fix client secret * Remove accidental import * Bump dependency * Add tests * Don't use VerticalGroup component * Remove unused import * Update docs * Fix lint * Appropriately set oAuthPassThru and disableGrafanaCache properties * Clear azureCredentials on authType change * Correctly retrieve secret * Feedback * Spelling * Update docs/sources/datasources/azure-monitor/_index.md Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com> * Update docs/sources/datasources/azure-monitor/_index.md Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com> * Update docs/sources/datasources/azure-monitor/_index.md Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com> * Update docs/sources/datasources/azure-monitor/_index.md Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com> --------- Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com> * Docs review * Update docs with additional configuration information * Fix to appropriately hide the query editor * Typo * Update isCredentialsComplete * Update test --------- Co-authored-by: Christopher Moyer <35463610+chri2547@users.noreply.github.com> Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> Co-authored-by: Larissa Wandzura <126723338+lwandz13@users.noreply.github.com>
141 lines
3.8 KiB
Go
141 lines
3.8 KiB
Go
package azmoncredentials
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/grafana/grafana-azure-sdk-go/v2/azcredentials"
|
|
"github.com/grafana/grafana-azure-sdk-go/v2/azsettings"
|
|
"github.com/grafana/grafana-plugin-sdk-go/data/utils/maputil"
|
|
)
|
|
|
|
func FromDatasourceData(data map[string]interface{}, secureData map[string]string) (azcredentials.AzureCredentials, error) {
|
|
var credentials azcredentials.AzureCredentials
|
|
var err error
|
|
|
|
credentials, err = azcredentials.FromDatasourceData(data, secureData)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Fallback to legacy credentials format
|
|
if credentials == nil {
|
|
credentials, err = getFromLegacy(data, secureData)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return credentials, err
|
|
}
|
|
|
|
func getFromLegacy(data map[string]interface{}, secureData map[string]string) (azcredentials.AzureCredentials, error) {
|
|
authType, err := maputil.GetStringOptional(data, "azureAuthType")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tenantId, err := maputil.GetStringOptional(data, "tenantId")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
clientId, err := maputil.GetStringOptional(data, "clientId")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if authType == "" {
|
|
// Some very old legacy datasources may not have explicit auth type specified,
|
|
// but they imply App Registration authentication
|
|
if tenantId != "" && clientId != "" {
|
|
authType = azcredentials.AzureAuthClientSecret
|
|
} else {
|
|
// No configuration present
|
|
return nil, nil
|
|
}
|
|
}
|
|
|
|
switch authType {
|
|
case azcredentials.AzureAuthManagedIdentity:
|
|
credentials := &azcredentials.AzureManagedIdentityCredentials{}
|
|
return credentials, nil
|
|
|
|
case azcredentials.AzureAuthWorkloadIdentity:
|
|
credentials := &azcredentials.AzureWorkloadIdentityCredentials{}
|
|
return credentials, nil
|
|
|
|
case azcredentials.AzureAuthCurrentUserIdentity:
|
|
legacyCloud, err := maputil.GetStringOptional(data, "cloudName")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cloud, err := resolveLegacyCloudName(legacyCloud)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
clientSecret := secureData["clientSecret"]
|
|
|
|
credentials := &azcredentials.AadCurrentUserCredentials{
|
|
ServiceCredentials: &azcredentials.AzureClientSecretCredentials{
|
|
AzureCloud: cloud,
|
|
TenantId: tenantId,
|
|
ClientId: clientId,
|
|
ClientSecret: clientSecret,
|
|
},
|
|
}
|
|
|
|
return credentials, nil
|
|
case azcredentials.AzureAuthClientSecret:
|
|
legacyCloud, err := maputil.GetStringOptional(data, "cloudName")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cloud, err := resolveLegacyCloudName(legacyCloud)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
clientSecret := secureData["clientSecret"]
|
|
|
|
if secureData["clientSecret"] == "" {
|
|
return nil, fmt.Errorf("unable to instantiate credentials, clientSecret must be set")
|
|
}
|
|
|
|
credentials := &azcredentials.AzureClientSecretCredentials{
|
|
AzureCloud: cloud,
|
|
TenantId: tenantId,
|
|
ClientId: clientId,
|
|
ClientSecret: clientSecret,
|
|
}
|
|
|
|
return credentials, nil
|
|
|
|
default:
|
|
err := fmt.Errorf("the authentication type '%s' not supported", authType)
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// Legacy Azure cloud names used by the Azure Monitor datasource
|
|
const (
|
|
azureMonitorPublic = "azuremonitor"
|
|
azureMonitorChina = "chinaazuremonitor"
|
|
azureMonitorUSGovernment = "govazuremonitor"
|
|
azureMonitorCustomized = "customizedazuremonitor"
|
|
)
|
|
|
|
func resolveLegacyCloudName(cloudName string) (string, error) {
|
|
switch cloudName {
|
|
case azureMonitorPublic:
|
|
return azsettings.AzurePublic, nil
|
|
case azureMonitorChina:
|
|
return azsettings.AzureChina, nil
|
|
case azureMonitorUSGovernment:
|
|
return azsettings.AzureUSGovernment, nil
|
|
case azureMonitorCustomized:
|
|
return azsettings.AzureCustomized, nil
|
|
case "":
|
|
return azsettings.AzurePublic, nil
|
|
default:
|
|
err := fmt.Errorf("the Azure cloud '%s' not supported by Azure Monitor datasource", cloudName)
|
|
return "", err
|
|
}
|
|
}
|