@@ -2,7 +2,6 @@ use super::{
2
2
AzureCliCredential , EnvironmentCredential , ManagedIdentityCredential , TokenCredential ,
3
3
} ;
4
4
use azure_core:: TokenResponse ;
5
- use log:: debug;
6
5
7
6
#[ derive( Debug , Default ) ]
8
7
/// Provides a mechanism of selectively disabling credentials used for a `DefaultAzureCredential` instance
@@ -67,8 +66,11 @@ pub enum DefaultAzureCredentialError {
67
66
EnvironmentCredentialError ( #[ from] super :: EnvironmentCredentialError ) ,
68
67
#[ error( "Error getting managed identity credential: {0}" ) ]
69
68
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 > ) ,
72
74
}
73
75
74
76
/// Types of TokenCredential supported by DefaultAzureCredential
@@ -134,16 +136,16 @@ impl TokenCredential for DefaultAzureCredential {
134
136
type Error = DefaultAzureCredentialError ;
135
137
/// Try to fetch a token using each of the credential sources until one succeeds
136
138
async fn get_token ( & self , resource : & str ) -> Result < TokenResponse , Self :: Error > {
139
+ let mut errors = Vec :: new ( ) ;
137
140
for source in & self . sources {
138
141
let token_res = source. get_token ( resource) . await ;
139
142
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) ,
144
146
}
145
147
}
146
- Err ( DefaultAzureCredentialError :: EndOfDefaultList )
148
+ Err ( DefaultAzureCredentialError :: CredentialUnavailable ( errors ) )
147
149
}
148
150
}
149
151
@@ -158,3 +160,11 @@ impl azure_core::TokenCredential for DefaultAzureCredential {
158
160
. map_err ( |error| azure_core:: Error :: GetTokenError ( Box :: new ( error) ) )
159
161
}
160
162
}
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