Skip to content

Commit b6a5eb8

Browse files
committed
implement more auth methods and add options for armclient and msgraphclient
Signed-off-by: Markus Blaschke <mail@markus-blaschke.de>
1 parent 7b1447c commit b6a5eb8

6 files changed

Lines changed: 80 additions & 12 deletions

File tree

azuresdk/README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
| Variable name | Default | Description |
88
|----------------------------------------------------|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
9+
| `AZURE_AUTH_METHOD` (or `AZURE_AUTH`) | none | Defines the force auth method, fallback is the default auth method from the azure-sdk-for-go |
910
| `AZURE_SERVICEDISCOVERY_CACHE_TTL` | `60m` (time.Duration) | ServiceDiscovery cache (eg. subscription, resourceGroup list,...) |
1011
| `AZURE_SERVICEDISCOVERY_SUBSCRIPTION_ID` | | Subscription IDs separated by commas or spaces (whitespaces are trimmed) |
1112
| `AZURE_SERVICEDISCOVERY_SUBSCRIPTION_TAG_SELECTOR` | | Tag selector `tagName=tagValue,tagName2=tagValue2` to filter subscriptions for ServiceDiscovery (uses [kubernetes label selector library](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors)) |
@@ -32,9 +33,17 @@ Hint: please also check [microsoft azure-sdk documentation](https://docs.microso
3233

3334
#### AzureCLI authentication
3435

35-
To force authentication via AzureCLI set `AZURE_AUTH=az` and the token is fetched from Azure CLI.
36+
To force authentication via AzureCLI set `AZURE_AUTH_METHOD=az` and the token is fetched from Azure CLI.
3637
For this method the `az` binary must be executable in `$PATH` (inside the container/environment).
3738

39+
#### Interactive browser authentication
40+
41+
To force authentication via interactive browser set `AZURE_AUTH_METHOD=interactive`.
42+
43+
#### Interactive devicetoken authentication
44+
45+
To force authentication via device token set `AZURE_AUTH_METHOD=devicetoken`.
46+
3847
#### WorkloadIdentity/Federation authentication
3948

4049
To force authentication via WorkloadIdentity/Federation set `AZURE_AUTH=federation`.

azuresdk/armclient/client.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ type (
5050
)
5151

5252
// NewArmClientFromEnvironment creates new Azure SDK ARM client from environment settings
53-
func NewArmClientFromEnvironment(logger *slog.Logger) (*ArmClient, error) {
53+
func NewArmClientFromEnvironment(logger *slog.Logger, opts ...ClientOptionFunc) (*ArmClient, error) {
5454
var azureEnvironment string
5555

5656
if azureEnvironment = os.Getenv("AZURE_ENVIRONMENT"); azureEnvironment == "" {
@@ -62,11 +62,11 @@ func NewArmClientFromEnvironment(logger *slog.Logger) (*ArmClient, error) {
6262
}
6363
}
6464

65-
return NewArmClientWithCloudName(azureEnvironment, logger)
65+
return NewArmClientWithCloudName(azureEnvironment, logger, opts...)
6666
}
6767

6868
// NewArmClient creates new Azure SDK ARM client
69-
func NewArmClient(cloudConfig cloudconfig.CloudEnvironment, logger *slog.Logger) *ArmClient {
69+
func NewArmClient(cloudConfig cloudconfig.CloudEnvironment, logger *slog.Logger, opts ...ClientOptionFunc) *ArmClient {
7070
client := &ArmClient{}
7171
client.cloud = cloudConfig
7272

@@ -81,17 +81,21 @@ func NewArmClient(cloudConfig cloudconfig.CloudEnvironment, logger *slog.Logger)
8181
client.initCache()
8282
client.initServiceDiscovery()
8383

84+
for _, opt := range opts {
85+
opt(client)
86+
}
87+
8488
return client
8589
}
8690

8791
// NewArmClientWithCloudName creates new Azure SDK ARM client with environment name as string
88-
func NewArmClientWithCloudName(cloudName string, logger *slog.Logger) (*ArmClient, error) {
92+
func NewArmClientWithCloudName(cloudName string, logger *slog.Logger, opts ...ClientOptionFunc) (*ArmClient, error) {
8993
cloudConfig, err := cloudconfig.NewCloudConfig(cloudName)
9094
if err != nil {
9195
return nil, err
9296
}
9397

94-
return NewArmClient(cloudConfig, logger), nil
98+
return NewArmClient(cloudConfig, logger, opts...), nil
9599
}
96100

97101
// init cache
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package armclient
2+
3+
import (
4+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
5+
)
6+
7+
type ClientOptionFunc func(*ArmClient)
8+
9+
// WithCred sets the az credential
10+
func WithCred(cred *azcore.TokenCredential) ClientOptionFunc {
11+
return func(client *ArmClient) {
12+
client.cred = cred
13+
}
14+
}
15+
16+
// WithUserAgent sets the HTTP user agent
17+
func WithUserAgent(userAgent string) ClientOptionFunc {
18+
return func(client *ArmClient) {
19+
client.userAgent = userAgent
20+
}
21+
}

azuresdk/azidentity/credential.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,19 @@ const (
2626

2727
func NewAzDefaultCredential(clientOptions *azcore.ClientOptions) (azcore.TokenCredential, error) {
2828
// azure authorizer
29-
switch strings.ToLower(os.Getenv("AZURE_AUTH")) {
29+
authMethod := strings.ToLower(os.Getenv("AZURE_AUTH_METHOD"))
30+
if authMethod == "" {
31+
authMethod = strings.ToLower(os.Getenv("AZURE_AUTH"))
32+
}
33+
34+
switch authMethod {
3035
case "az", "cli", "azcli":
3136
// azurecli authentication
3237
return NewAzCliCredential()
38+
case "devicetoken":
39+
return azidentity.NewDeviceCodeCredential(nil)
40+
case "interactive", "browser", "interactivebrowser":
41+
return azidentity.NewInteractiveBrowserCredential(nil)
3342
case "wi", "workload", "workloadidentity", "federation":
3443
var tokenFile, tenantID, clientID string
3544
var ok bool

msgraphsdk/msgraphclient/client.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type (
3737
)
3838

3939
// NewMsGraphClientFromEnvironment creates new MS Graph client from environment settings
40-
func NewMsGraphClientFromEnvironment(logger *slog.Logger) (*MsGraphClient, error) {
40+
func NewMsGraphClientFromEnvironment(logger *slog.Logger, opts ...ClientOptionFunc) (*MsGraphClient, error) {
4141
var azureEnvironment, azureTenant string
4242

4343
if azureEnvironment = os.Getenv("AZURE_ENVIRONMENT"); azureEnvironment == "" {
@@ -53,11 +53,11 @@ func NewMsGraphClientFromEnvironment(logger *slog.Logger) (*MsGraphClient, error
5353
return nil, fmt.Errorf(`env var AZURE_TENANT_ID is not set`)
5454
}
5555

56-
return NewMsGraphClientWithCloudName(azureEnvironment, azureTenant, logger)
56+
return NewMsGraphClientWithCloudName(azureEnvironment, azureTenant, logger, opts...)
5757
}
5858

5959
// NewMsGraphClient creates new MS Graph client
60-
func NewMsGraphClient(cloudConfig cloudconfig.CloudEnvironment, tenantID string, logger *slog.Logger) *MsGraphClient {
60+
func NewMsGraphClient(cloudConfig cloudconfig.CloudEnvironment, tenantID string, logger *slog.Logger, opts ...ClientOptionFunc) *MsGraphClient {
6161
client := &MsGraphClient{}
6262
client.cloud = cloudConfig
6363
client.tenantID = tenantID
@@ -68,16 +68,20 @@ func NewMsGraphClient(cloudConfig cloudconfig.CloudEnvironment, tenantID string,
6868
client.logger = logger
6969
client.userAgent = "go-common/unknown"
7070

71+
for _, opt := range opts {
72+
opt(client)
73+
}
74+
7175
return client
7276
}
7377

7478
// NewMsGraphClientWithCloudName creates new MS Graph client with environment name as string
75-
func NewMsGraphClientWithCloudName(cloudName string, tenantID string, logger *slog.Logger) (*MsGraphClient, error) {
79+
func NewMsGraphClientWithCloudName(cloudName string, tenantID string, logger *slog.Logger, opts ...ClientOptionFunc) (*MsGraphClient, error) {
7680
cloudConfig, err := cloudconfig.NewCloudConfig(cloudName)
7781
if err != nil {
7882
return nil, err
7983
}
80-
return NewMsGraphClient(cloudConfig, tenantID, logger), nil
84+
return NewMsGraphClient(cloudConfig, tenantID, logger, opts...), nil
8185
}
8286

8387
// ServiceClient returns msgraph service client
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package msgraphclient
2+
3+
import (
4+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
5+
)
6+
7+
type ClientOptionFunc func(*MsGraphClient)
8+
9+
// WithCred sets the az credential
10+
func WithCred(cred *azcore.TokenCredential) ClientOptionFunc {
11+
return func(client *MsGraphClient) {
12+
client.cred = cred
13+
}
14+
}
15+
16+
// WithUserAgent sets the HTTP user agent
17+
func WithUserAgent(userAgent string) ClientOptionFunc {
18+
return func(client *MsGraphClient) {
19+
client.userAgent = userAgent
20+
}
21+
}

0 commit comments

Comments
 (0)