pub mod cli;
pub mod managed_identity;
pub mod service_principal;
pub mod token;
pub use token::{AccessToken, CachedToken};
use crate::error::AzureError;
pub enum AzureCredential {
ServicePrincipal(service_principal::ServicePrincipalCredential),
ManagedIdentity(managed_identity::ManagedIdentityCredential),
AzureCli(cli::AzureCliCredential),
}
impl AzureCredential {
pub async fn get_token(&self) -> Result<AccessToken, AzureError> {
match self {
AzureCredential::ServicePrincipal(sp) => sp.get_token().await,
AzureCredential::ManagedIdentity(mi) => mi.get_token().await,
AzureCredential::AzureCli(cli) => cli.get_token().await,
}
}
pub(crate) async fn get_token_for_scope(&self, scope: &str) -> Result<AccessToken, AzureError> {
match self {
AzureCredential::ServicePrincipal(sp) => sp.get_token_for_scope(scope).await,
AzureCredential::ManagedIdentity(mi) => mi.get_token_for_scope(scope).await,
AzureCredential::AzureCli(cli) => cli.get_token_for_scope(scope).await,
}
}
}
pub async fn default_credential() -> Result<AzureCredential, AzureError> {
if let Some(sp) = service_principal::ServicePrincipalCredential::from_env() {
return Ok(AzureCredential::ServicePrincipal(sp));
}
let mi = managed_identity::ManagedIdentityCredential::new();
if mi.get_token().await.is_ok() {
return Ok(AzureCredential::ManagedIdentity(mi));
}
let az = cli::AzureCliCredential::new();
match az.get_token().await {
Ok(_) => Ok(AzureCredential::AzureCli(az)),
Err(e) => Err(AzureError::Auth {
message: format!(
"No Azure credentials found. \
Set AZURE_CLIENT_ID/AZURE_CLIENT_SECRET/AZURE_TENANT_ID for service principal auth, \
run on Azure for managed identity, or run 'az login' for CLI auth. \
Last error: {e}"
),
}),
}
}