Skip to content

Commit fa5eca7

Browse files
authored
Merge pull request #21 from vajura/feature/azure-keyvault
Fixed enviroment variable name. Token can now be set directly as a env
2 parents 5dab83f + da1eac1 commit fa5eca7

File tree

2 files changed

+42
-38
lines changed

2 files changed

+42
-38
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ then you can access secrets from that Vault using the following syntax:
121121
### Azure keyvault secrets
122122

123123
If you have the environment variables:
124-
* `AZURE_SUBSCRIPTION_ID`
124+
* `AZURE_TENANT_ID`
125125
* `AZURE_CLIENT_ID`
126126
* `AZURE_CLIENT_SECRET`
127127
* `AZURE_KEY_VAULT_URL`
@@ -133,6 +133,12 @@ then you can also access secrets from that Azure keyvault using the following sy
133133
{{ .Azure.Secret "secrets--path" }}
134134
```
135135

136+
Alternatively you can set:
137+
* `AZURE_TOKEN`
138+
139+
to your personal token via `az account get-access-token --resource https://vault.azure.net`,
140+
then you only additionally need `AZURE_KEY_VAULT_URL` to access your secrets.
141+
136142
The path in keyvault can only contain alphanumeric characters and dashes.
137143

138144
### Secrets as JSON

internal/world/azure.go

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import (
1313
)
1414

1515
const (
16-
AzureSubscriptionId string = "AZURE_SUBSCRIPTION_ID"
16+
AzureTenantId string = "AZURE_TENANT_ID"
1717
AzureClientId string = "AZURE_CLIENT_ID"
1818
AzureClientSecret string = "AZURE_CLIENT_SECRET"
1919
AzureKeyVaultUrl string = "AZURE_KEY_VAULT_URL"
2020
AzureApiVersion string = "AZURE_API_VERSION"
21+
AzureToken string = "AZURE_TOKEN"
2122
AzureVaultUrl string = "https://vault.azure.net"
2223
AzureClientCredentialsGrant string = "client_credentials"
2324
MicrosoftLoginUrl string = "https://login.microsoftonline.com/"
@@ -44,49 +45,51 @@ type AzureSecretVersions struct {
4445
}
4546

4647
type Azure struct {
47-
logger *logrus.Logger
48-
Prefix string
49-
KeyMapping map[string]string
50-
keyVaultUrl string
51-
subscriptionId string
52-
clientId string
53-
clientSecret string
54-
apiVersion string
55-
token string
48+
logger *logrus.Logger
49+
Prefix string
50+
KeyMapping map[string]string
51+
keyVaultUrl string
52+
tenantId string
53+
clientId string
54+
clientSecret string
55+
apiVersion string
56+
token string
5657
}
5758

5859
func (w *World) Azure() *Azure {
5960
if w.azure != nil {
6061
return w.azure
6162
}
62-
azureSubscriptionId := w.checkAzureEnv(AzureSubscriptionId)
63-
azureClientId := w.checkAzureEnv(AzureClientId)
64-
azureClientSecret := w.checkAzureEnv(AzureClientSecret)
65-
azureKeyVaultUrl := w.checkAzureEnv(AzureKeyVaultUrl)
66-
azureApiVersion := w.checkAzureEnv(AzureApiVersion)
63+
tenantId := os.Getenv(AzureTenantId)
64+
azureClientId := os.Getenv(AzureClientId)
65+
azureClientSecret := os.Getenv(AzureClientSecret)
66+
azureKeyVaultUrl := os.Getenv(AzureKeyVaultUrl)
67+
azureApiVersion := os.Getenv(AzureApiVersion)
68+
azureToken := os.Getenv(AzureToken)
6769

6870
if azureApiVersion == "" {
6971
azureApiVersion = "7.0"
7072
}
7173

72-
w.azure = &Azure{
73-
logger: w.logger,
74-
KeyMapping: make(map[string]string),
75-
subscriptionId: azureSubscriptionId,
76-
clientId: azureClientId,
77-
clientSecret: azureClientSecret,
78-
keyVaultUrl: azureKeyVaultUrl,
79-
apiVersion: azureApiVersion,
74+
if azureKeyVaultUrl == "" {
75+
w.logger.Warnf("%v not set.", AzureKeyVaultUrl)
8076
}
81-
return w.azure
82-
}
8377

84-
func (w *World) checkAzureEnv(env string) string {
85-
value := os.Getenv(env)
86-
if w.logger != nil && value == "" {
87-
w.logger.Warnf("%v not set.", env)
78+
if azureToken == "" && (tenantId == "" || azureClientId == "" || azureClientSecret == "") {
79+
w.logger.Warnf("%s or %s, %s, %s needs to be set", AzureToken, AzureTenantId, AzureClientId, AzureClientSecret)
8880
}
89-
return value
81+
82+
w.azure = &Azure{
83+
logger: w.logger,
84+
KeyMapping: make(map[string]string),
85+
tenantId: tenantId,
86+
clientId: azureClientId,
87+
clientSecret: azureClientSecret,
88+
keyVaultUrl: azureKeyVaultUrl,
89+
apiVersion: azureApiVersion,
90+
token: azureToken,
91+
}
92+
return w.azure
9093
}
9194

9295
func (a *Azure) Secret(path string) (string, error) {
@@ -95,10 +98,6 @@ func (a *Azure) Secret(path string) (string, error) {
9598
if !ok {
9699
mapped = path
97100
}
98-
err := a.getBearerToken()
99-
if err != nil {
100-
return "", errors.Wrap(err, "could not get access token from https://login.microsoftonline.com/")
101-
}
102101
latestSecretVersion, err := a.getLatestSecretVersion(mapped)
103102
if err != nil {
104103
return "", errors.Wrapf(err, "could not get secrets version for %s", mapped)
@@ -124,8 +123,7 @@ func (a *Azure) getSecret(path string, secretVersion string) (string, error) {
124123
}
125124

126125
func (a *Azure) getLatestSecretVersion(path string) (string, error) {
127-
secretPath := path
128-
body, err := a.doVaultRequest(fmt.Sprintf("/secrets/%s/versions", secretPath))
126+
body, err := a.doVaultRequest(fmt.Sprintf("/secrets/%s/versions", path))
129127
if err != nil {
130128
return "", err
131129
}
@@ -186,7 +184,7 @@ func (a *Azure) getBearerToken() error {
186184
if err != nil {
187185
return err
188186
}
189-
u.Path = fmt.Sprintf("/%s/oauth2/token", a.subscriptionId)
187+
u.Path = fmt.Sprintf("/%s/oauth2/token", a.tenantId)
190188
client := &http.Client{}
191189
r, err := http.NewRequest("POST", u.String(), strings.NewReader(params.Encode()))
192190
if err != nil {

0 commit comments

Comments
 (0)