mirror of
https://github.com/rclone/rclone.git
synced 2025-08-09 21:57:59 +02:00
azureblob,azurefiles: add support for client assertion based authentication
This commit is contained in:
@ -984,6 +984,38 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
}
|
}
|
||||||
|
case opt.ClientID != "" && opt.Tenant != "" && opt.MSIClientID != "":
|
||||||
|
// Workload Identity based authentication
|
||||||
|
var options azidentity.ManagedIdentityCredentialOptions
|
||||||
|
options.ID = azidentity.ClientID(opt.MSIClientID)
|
||||||
|
|
||||||
|
msiCred, err := azidentity.NewManagedIdentityCredential(&options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
getClientAssertions := func(context.Context) (string, error) {
|
||||||
|
token, err := msiCred.GetToken(context.Background(), policy.TokenRequestOptions{
|
||||||
|
Scopes: []string{"api://AzureADTokenExchange"},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return token.Token, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
assertOpts := &azidentity.ClientAssertionCredentialOptions{}
|
||||||
|
f.cred, err = azidentity.NewClientAssertionCredential(
|
||||||
|
opt.Tenant,
|
||||||
|
opt.ClientID,
|
||||||
|
getClientAssertions,
|
||||||
|
assertOpts)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to acquire client assertion token: %w", err)
|
||||||
|
}
|
||||||
case opt.UseAZ:
|
case opt.UseAZ:
|
||||||
var options = azidentity.AzureCLICredentialOptions{}
|
var options = azidentity.AzureCLICredentialOptions{}
|
||||||
f.cred, err = azidentity.NewAzureCLICredential(&options)
|
f.cred, err = azidentity.NewAzureCLICredential(&options)
|
||||||
|
@ -569,6 +569,38 @@ func newFsFromOptions(ctx context.Context, name, root string, opt *Options) (fs.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
}
|
}
|
||||||
|
case opt.ClientID != "" && opt.Tenant != "" && opt.MSIClientID != "":
|
||||||
|
// Workload Identity based authentication
|
||||||
|
var options azidentity.ManagedIdentityCredentialOptions
|
||||||
|
options.ID = azidentity.ClientID(opt.MSIClientID)
|
||||||
|
|
||||||
|
msiCred, err := azidentity.NewManagedIdentityCredential(&options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
getClientAssertions := func(context.Context) (string, error) {
|
||||||
|
token, err := msiCred.GetToken(context.Background(), policy.TokenRequestOptions{
|
||||||
|
Scopes: []string{"api://AzureADTokenExchange"},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to acquire MSI token: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return token.Token, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
assertOpts := &azidentity.ClientAssertionCredentialOptions{}
|
||||||
|
cred, err = azidentity.NewClientAssertionCredential(
|
||||||
|
opt.Tenant,
|
||||||
|
opt.ClientID,
|
||||||
|
getClientAssertions,
|
||||||
|
assertOpts)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to acquire client assertion token: %w", err)
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("no authentication method configured")
|
return nil, errors.New("no authentication method configured")
|
||||||
}
|
}
|
||||||
|
@ -297,6 +297,16 @@ be explicitly specified using exactly one of the `msi_object_id`,
|
|||||||
If none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is
|
If none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is
|
||||||
set, this is is equivalent to using `env_auth`.
|
set, this is is equivalent to using `env_auth`.
|
||||||
|
|
||||||
|
#### Fedrated Identity Credentials
|
||||||
|
|
||||||
|
If these variables are set, rclone will authenticate with fedrated identity.
|
||||||
|
|
||||||
|
- `tenant_id`: tenant_id to authenticate in storage
|
||||||
|
- `client_id`: client ID of the application the user will authenticate to storage
|
||||||
|
- `msi_client_id`: managed identity client ID of the application the user will authenticate to
|
||||||
|
|
||||||
|
By default "api://AzureADTokenExchange" is used as scope for token retrieval over MSI. This token is then exchanged for actual storage token using 'tenant_id' and 'client_id'.
|
||||||
|
|
||||||
#### Azure CLI tool `az` {#use_az}
|
#### Azure CLI tool `az` {#use_az}
|
||||||
|
|
||||||
Set to use the [Azure CLI tool `az`](https://learn.microsoft.com/en-us/cli/azure/)
|
Set to use the [Azure CLI tool `az`](https://learn.microsoft.com/en-us/cli/azure/)
|
||||||
|
@ -296,6 +296,16 @@ be explicitly specified using exactly one of the `msi_object_id`,
|
|||||||
If none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is
|
If none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is
|
||||||
set, this is is equivalent to using `env_auth`.
|
set, this is is equivalent to using `env_auth`.
|
||||||
|
|
||||||
|
#### Fedrated Identity Credentials
|
||||||
|
|
||||||
|
If these variables are set, rclone will authenticate with fedrated identity.
|
||||||
|
|
||||||
|
- `tenant_id`: tenant_id to authenticate in storage
|
||||||
|
- `client_id`: client ID of the application the user will authenticate to storage
|
||||||
|
- `msi_client_id`: managed identity client ID of the application the user will authenticate to
|
||||||
|
|
||||||
|
By default "api://AzureADTokenExchange" is used as scope for token retrieval over MSI. This token is then exchanged for actual storage token using 'tenant_id' and 'client_id'.
|
||||||
|
|
||||||
#### Azure CLI tool `az` {#use_az}
|
#### Azure CLI tool `az` {#use_az}
|
||||||
Set to use the [Azure CLI tool `az`](https://learn.microsoft.com/en-us/cli/azure/)
|
Set to use the [Azure CLI tool `az`](https://learn.microsoft.com/en-us/cli/azure/)
|
||||||
as the sole means of authentication.
|
as the sole means of authentication.
|
||||||
|
Reference in New Issue
Block a user