Skip to content

Commit 1e52c00

Browse files
JoshGendeinJoshua Gendein
andauthored
[Identity] Aggregate errors for get_token (#481)
Co-authored-by: Joshua Gendein <jgendein@microsoft.com>
1 parent bcbd8a0 commit 1e52c00

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

sdk/identity/src/token_credentials/default_credentials.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use super::{
22
AzureCliCredential, EnvironmentCredential, ManagedIdentityCredential, TokenCredential,
33
};
44
use azure_core::TokenResponse;
5-
use log::debug;
65

76
#[derive(Debug, Default)]
87
/// Provides a mechanism of selectively disabling credentials used for a `DefaultAzureCredential` instance
@@ -67,8 +66,11 @@ pub enum DefaultAzureCredentialError {
6766
EnvironmentCredentialError(#[from] super::EnvironmentCredentialError),
6867
#[error("Error getting managed identity credential: {0}")]
6968
ManagedIdentityCredentialError(#[from] super::ManagedIdentityCredentialError),
70-
#[error("End of default list")]
71-
EndOfDefaultList,
69+
#[error(
70+
"Multiple errors were encountered while attempting to authenticate:\n{}",
71+
format_aggregate_error(.0)
72+
)]
73+
CredentialUnavailable(Vec<DefaultAzureCredentialError>),
7274
}
7375

7476
/// Types of TokenCredential supported by DefaultAzureCredential
@@ -134,16 +136,16 @@ impl TokenCredential for DefaultAzureCredential {
134136
type Error = DefaultAzureCredentialError;
135137
/// Try to fetch a token using each of the credential sources until one succeeds
136138
async fn get_token(&self, resource: &str) -> Result<TokenResponse, Self::Error> {
139+
let mut errors = Vec::new();
137140
for source in &self.sources {
138141
let token_res = source.get_token(resource).await;
139142

140-
if let Ok(token) = token_res {
141-
return Ok(token);
142-
} else {
143-
debug!("Failed to get credentials: {:?}", token_res.err().unwrap());
143+
match token_res {
144+
Ok(token) => return Ok(token),
145+
Err(error) => errors.push(error),
144146
}
145147
}
146-
Err(DefaultAzureCredentialError::EndOfDefaultList)
148+
Err(DefaultAzureCredentialError::CredentialUnavailable(errors))
147149
}
148150
}
149151

@@ -158,3 +160,11 @@ impl azure_core::TokenCredential for DefaultAzureCredential {
158160
.map_err(|error| azure_core::Error::GetTokenError(Box::new(error)))
159161
}
160162
}
163+
164+
fn format_aggregate_error(errors: &[DefaultAzureCredentialError]) -> String {
165+
errors
166+
.iter()
167+
.map(|error| error.to_string())
168+
.collect::<Vec<String>>()
169+
.join("\n")
170+
}

0 commit comments

Comments
 (0)