@@ -2,7 +2,6 @@ use super::{
22 AzureCliCredential , EnvironmentCredential , ManagedIdentityCredential , TokenCredential ,
33} ;
44use 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