Skip to content

Commit f254d90

Browse files
JoshGendeinJoshua Gendein
andauthored
Check status code for ManagedIdentityCredential (#511)
Co-authored-by: Joshua Gendein <jgendein@microsoft.com>
1 parent 4781508 commit f254d90

File tree

3 files changed

+31
-25
lines changed

3 files changed

+31
-25
lines changed

sdk/identity/src/token_credentials/default_credentials.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{
2-
AzureCliCredential, EnvironmentCredential, ManagedIdentityCredential, TokenCredential,
2+
AzureCliCredential, EnvironmentCredential, ImdsManagedIdentityCredential, TokenCredential,
33
};
44
use azure_core::TokenResponse;
55

@@ -47,7 +47,7 @@ impl DefaultAzureCredentialBuilder {
4747
}
4848
if self.include_managed_identity_credential {
4949
sources.push(DefaultAzureCredentialEnum::ManagedIdentity(
50-
ManagedIdentityCredential {},
50+
ImdsManagedIdentityCredential {},
5151
))
5252
}
5353
if self.include_cli_credential {
@@ -76,7 +76,7 @@ pub enum DefaultAzureCredentialError {
7676
/// Types of TokenCredential supported by DefaultAzureCredential
7777
pub enum DefaultAzureCredentialEnum {
7878
Environment(EnvironmentCredential),
79-
ManagedIdentity(ManagedIdentityCredential),
79+
ManagedIdentity(ImdsManagedIdentityCredential),
8080
AzureCli(AzureCliCredential),
8181
}
8282

@@ -124,7 +124,7 @@ impl Default for DefaultAzureCredential {
124124
DefaultAzureCredential {
125125
sources: vec![
126126
DefaultAzureCredentialEnum::Environment(EnvironmentCredential::default()),
127-
DefaultAzureCredentialEnum::ManagedIdentity(ManagedIdentityCredential {}),
127+
DefaultAzureCredentialEnum::ManagedIdentity(ImdsManagedIdentityCredential {}),
128128
DefaultAzureCredentialEnum::AzureCli(AzureCliCredential {}),
129129
],
130130
}

sdk/identity/src/token_credentials/managed_identity_credentials.rs renamed to sdk/identity/src/token_credentials/imds_managed_identity_credentials.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const MSI_API_VERSION: &str = "2019-08-01";
1818
/// This authentication type works in Azure VMs, App Service and Azure Functions applications, as well as the Azure Cloud Shell
1919
///
2020
/// Built up from docs at [https://docs.microsoft.com/azure/app-service/overview-managed-identity#using-the-rest-protocol](https://docs.microsoft.com/azure/app-service/overview-managed-identity#using-the-rest-protocol)
21-
pub struct ManagedIdentityCredential;
21+
pub struct ImdsManagedIdentityCredential;
2222

2323
#[non_exhaustive]
2424
#[derive(Debug, thiserror::Error)]
@@ -32,14 +32,16 @@ pub enum ManagedIdentityCredentialError {
3232
MissingMsiSecret(std::env::VarError),
3333
#[error("Refresh token send error: {0}")]
3434
SendError(reqwest::Error),
35-
#[error("Error getting text for refresh token: {0}")]
36-
TextError(reqwest::Error),
3735
#[error("Error deserializing refresh token: {0}")]
38-
DeserializeError(serde_json::Error),
36+
DeserializeError(reqwest::Error),
37+
#[error("The requested identity has not been assigned to this resource.")]
38+
IdentityUnavailableError,
39+
#[error("The request failed due to a gateway error.")]
40+
GatewayError,
3941
}
4042

4143
#[async_trait::async_trait]
42-
impl TokenCredential for ManagedIdentityCredential {
44+
impl TokenCredential for ImdsManagedIdentityCredential {
4345
type Error = ManagedIdentityCredentialError;
4446

4547
async fn get_token(&self, resource: &str) -> Result<TokenResponse, Self::Error> {
@@ -55,29 +57,33 @@ impl TokenCredential for ManagedIdentityCredential {
5557
.map_err(ManagedIdentityCredentialError::MissingMsiSecret)?;
5658

5759
let client = reqwest::Client::new();
58-
let res_body = client
60+
let response = client
5961
.get(msi_endpoint_url)
6062
.header("Metadata", "true")
6163
.header("X-IDENTITY-HEADER", msi_secret)
6264
.send()
6365
.await
64-
.map_err(ManagedIdentityCredentialError::SendError)?
65-
.text()
66-
.await
67-
.map_err(ManagedIdentityCredentialError::TextError)?;
68-
69-
let token_response = serde_json::from_str::<MsiTokenResponse>(&res_body)
70-
.map_err(ManagedIdentityCredentialError::DeserializeError)?;
71-
72-
Ok(TokenResponse::new(
73-
token_response.access_token,
74-
token_response.expires_on,
75-
))
66+
.map_err(ManagedIdentityCredentialError::SendError)?;
67+
68+
match response.status().as_u16() {
69+
400 => Err(ManagedIdentityCredentialError::IdentityUnavailableError),
70+
502 | 504 => Err(ManagedIdentityCredentialError::GatewayError),
71+
_ => {
72+
let token_response = response
73+
.json::<MsiTokenResponse>()
74+
.await
75+
.map_err(ManagedIdentityCredentialError::DeserializeError)?;
76+
Ok(TokenResponse::new(
77+
token_response.access_token,
78+
token_response.expires_on,
79+
))
80+
}
81+
}
7682
}
7783
}
7884

7985
#[async_trait::async_trait]
80-
impl azure_core::TokenCredential for ManagedIdentityCredential {
86+
impl azure_core::TokenCredential for ImdsManagedIdentityCredential {
8187
async fn get_token(
8288
&self,
8389
resource: &str,

sdk/identity/src/token_credentials/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ mod cli_credentials;
99
mod client_secret_credentials;
1010
mod default_credentials;
1111
mod environment_credentials;
12-
mod managed_identity_credentials;
12+
mod imds_managed_identity_credentials;
1313

1414
pub use cli_credentials::*;
1515
pub use client_secret_credentials::*;
1616
pub use default_credentials::*;
1717
pub use environment_credentials::*;
18-
pub use managed_identity_credentials::*;
18+
pub use imds_managed_identity_credentials::*;
1919

2020
/// Represents a credential capable of providing an OAuth token.
2121
/// Same as [azure_core::TokenCredential](azure_core::TokenCredential), except a more specific error is returned.

0 commit comments

Comments
 (0)