pkg/dataplane/internal/sample/client.go (60 lines of code) (raw):

package main import ( "context" "crypto/sha256" "log" "math/big" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" "github.com/Azure/msi-dataplane/pkg/dataplane" ) func main() { azureCredential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("failed to initialize azure credentials: %v", err) } // create a client for the MSI dataplane factory := dataplane.NewClientFactory(azureCredential, "audience", nil) identityURL := "" // value of the x-ms-identity-url header from ARM msiClient, err := factory.NewClient(identityURL) if err != nil { log.Fatalf("error creating msi dataplane client: %v", err) } // get the credential for some identities credential, err := msiClient.GetUserAssignedIdentitiesCredentials(context.Background(), dataplane.UserAssignedIdentitiesRequest{ IdentityIDs: []string{ "someIdentity", "someOtherIdentity", }, }) if err != nil { log.Fatalf("error retrieving credential: %v", err) } // create a client for KeyVault keyVaultUrl := "" // from your configuration secretsClient, err := azsecrets.NewClient(keyVaultUrl, azureCredential, nil) if err != nil { log.Fatalf("error creating secrets client: %v", err) } // either store as a single msi in KeyVault identifier := "" // something meaningful to you name, params, err := dataplane.FormatManagedIdentityCredentialsForStorage(identifier, *credential) if err != nil { log.Fatalf("error formatting managed identity credentials: %v", err) } if _, err := secretsClient.SetSecret(context.Background(), name, params, nil); err != nil { log.Fatalf("error uploading managed identity credentials to key vault: %v", err) } // or store individual uamsi values for _, identity := range credential.ExplicitIdentities { // choose some identifier known to clients that do not have access to the identity object for storage, // to allow lookups identifier := base36sha224([]byte(*identity.ObjectID)) name, params, err := dataplane.FormatUserAssignedIdentityCredentialsForStorage(identifier, identity) if err != nil { log.Fatalf("error formatting user-assigned managed identity credentials: %v", err) } if _, err := secretsClient.SetSecret(context.Background(), name, params, nil); err != nil { log.Fatalf("error uploading user-assigned managed identity credentials to key vault: %v", err) } } } func base36sha224(input []byte) string { // base36(sha224(value)) produces a useful, deterministic value that fits the requirements to be // a KeyVault object name (honoring length requirement, is a valid DNS subdomain, etc) hash := sha256.Sum224(input) var i big.Int i.SetBytes(hash[:]) return i.Text(36) }