Skip to content

Commit f8f8525

Browse files
authored
Move to azure identity scopes (#1493)
1 parent 588d27d commit f8f8525

File tree

1,003 files changed

+141196
-392656
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,003 files changed

+141196
-392656
lines changed

sdk/core/src/auth.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use serde::{Deserialize, Serialize};
44
use std::{borrow::Cow, fmt::Debug};
55
use time::OffsetDateTime;
66

7+
pub static DEFAULT_SCOPE_SUFFIX: &str = "/.default";
8+
79
#[derive(Clone, Deserialize, Serialize, Eq)]
810
pub struct Secret(Cow<'static, str>);
911

@@ -83,7 +85,7 @@ impl AccessToken {
8385
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
8486
pub trait TokenCredential: Send + Sync + Debug {
8587
/// Gets a `AccessToken` for the specified resource
86-
async fn get_token(&self, resource: &str) -> crate::Result<AccessToken>;
88+
async fn get_token(&self, scopes: &[&str]) -> crate::Result<AccessToken>;
8789

8890
/// Clear the credential's cache.
8991
async fn clear_cache(&self) -> crate::Result<()>;

sdk/data_cosmos/src/authorization_policy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ async fn generate_authorization(
165165
"aad",
166166
Cow::Owned(
167167
token_credential
168-
.get_token(&scope_from_url(url))
168+
.get_token(&[&scope_from_url(url)])
169169
.await?
170170
.token
171171
.secret()

sdk/identity/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::error::Error;
1616
async fn main() -> Result<(), Box<dyn Error>> {
1717
let credential = DefaultAzureCredential::default();
1818
let response = credential
19-
.get_token("https://management.azure.com")
19+
.get_token(&["https://management.azure.com/.default"])
2020
.await?;
2121

2222
let subscription_id = env::var("AZURE_SUBSCRIPTION_ID")?;

sdk/identity/examples/azure_cli_credentials.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ async fn main() -> Result<(), Box<dyn Error>> {
99
println!("Azure cli subscription: {sub_id}");
1010

1111
let creds = AzureCliCredential::new();
12-
let res = creds.get_token("https://management.azure.com/").await?;
12+
let res = creds
13+
.get_token(&["https://management.azure.com/.default"])
14+
.await?;
1315
println!("Azure cli response == {res:?}");
1416
// Let's enumerate the Azure storage accounts
1517
// in the subscription. Note: this way of calling the REST API

sdk/identity/examples/client_certificate_credentials.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,53 @@
33
/// authenticate the app. If you are using subject name validation for the app
44
/// please make sure to set the `send_certificate_chain` option to true otherwise
55
/// the authentication will fail.
6-
use azure_core::{auth::TokenCredential, base64};
6+
use azure_core::{
7+
auth::{Secret, TokenCredential},
8+
base64,
9+
};
710
use azure_identity::{
811
CertificateCredentialOptions, ClientCertificateCredential, DefaultAzureCredential,
912
};
1013
use azure_security_keyvault::KeyvaultClient;
1114
use std::env::var;
1215
use url::Url;
1316

14-
async fn get_certficate(vault_name: &str, certificate_name: &str) -> azure_core::Result<Vec<u8>> {
17+
async fn get_certficate(vault_name: &str, certificate_name: &str) -> azure_core::Result<Secret> {
1518
let creds = DefaultAzureCredential::default();
1619
let client = KeyvaultClient::new(
1720
format!("https://{}.vault.azure.net", vault_name).as_str(),
1821
std::sync::Arc::new(creds),
1922
)?
20-
.secret_client();
21-
let secret = client.get(certificate_name).await?;
22-
let cert = base64::decode(secret.value)?;
23-
Ok(cert)
23+
.certificate_client();
24+
let response = client.get(certificate_name).await?;
25+
println!("GOT {response:#?}");
26+
Ok(response.cer)
2427
}
2528

2629
#[tokio::main]
27-
async fn main() -> azure_core::Result<()> {
30+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
31+
env_logger::init();
32+
2833
let client_id = var("CLIENT_ID").expect("Missing CLIENT_ID environment variable.");
2934
let tenant_id = var("TENANT_ID").expect("Missing TENANT_ID environment variable.");
3035
let subscription_id =
3136
var("SUBSCRIPTION_ID").expect("Missing SUBSCRIPTION_ID environment variable.");
3237

33-
let keyvault_uri = var("KEYVAULT_URI").expect("Missing KEYVAULT_URI environment variable.");
38+
let keyvault_name = var("KEYVAULT_NAME").expect("Missing KEYVAULT_NAME environment variable.");
3439
let cert_name = var("CERT_NAME").expect("Missing CERT_NAME environment variable.");
35-
let cert = get_certficate(&keyvault_uri, &cert_name).await?;
40+
let cert = get_certficate(&keyvault_name, &cert_name).await?;
3641

3742
let mut options = CertificateCredentialOptions::default();
3843
// set as true to to send certificate chain
3944
options.set_send_certificate_chain(true);
4045

4146
// pass is empty by default when certificate is fetched from keyvault
42-
let creds = ClientCertificateCredential::new(
43-
tenant_id,
44-
client_id,
45-
base64::encode(cert),
46-
String::new(),
47-
options,
48-
);
47+
let creds =
48+
ClientCertificateCredential::new(tenant_id, client_id, cert, String::new(), options);
4949

50-
let res = creds.get_token("https://management.azure.com/").await?;
50+
let res = creds
51+
.get_token(&["https://management.azure.com/.default"])
52+
.await?;
5153
// Let's enumerate the Azure SQL Databases instances
5254
// in the subscription. Note: this way of calling the REST API
5355
// will be different (and easier) using other Azure Rust SDK

sdk/identity/examples/code_flow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
2121
Some(client_secret),
2222
&tenant_id,
2323
Url::parse("http://localhost:3003/redirect").unwrap(),
24-
"https://management.azure.com/user_impersonation",
24+
&["https://management.azure.com/user_impersonation"],
2525
);
2626

2727
println!("c == {code_flow:?}");

sdk/identity/examples/code_flow_blob.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ async fn main() -> Result<(), Box<dyn Error>> {
3030
Some(client_secret),
3131
&tenant_id,
3232
Url::parse("http://localhost:3003/redirect").unwrap(),
33-
&format!("https://{storage_account_name}.blob.core.windows.net/user_impersonation"),
33+
&[&format!(
34+
"https://{storage_account_name}.blob.core.windows.net/user_impersonation"
35+
)],
3436
);
3537

3638
println!("c == {c:?}");

sdk/identity/examples/default_credentials.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ async fn main() -> Result<(), Box<dyn Error>> {
99

1010
let sub_id = var("AZURE_SUBSCRIPTION_ID")?;
1111
let creds = DefaultAzureCredentialBuilder::new()
12-
.exclude_azure_cli_credential() // disable using CLI for credentials (just as an example)
12+
.exclude_environment_credential() // disable using environment variables for credentials (just as an example)
1313
.build();
1414

1515
let res = creds
16-
.get_token("https://management.azure.com/")
16+
.get_token(&["https://management.azure.com/.default"])
1717
.await
1818
.unwrap();
1919
eprintln!("Azure token response == {res:?}");

sdk/identity/examples/environment_credentials.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use url::Url;
77
async fn main() -> Result<(), Box<dyn Error>> {
88
let sub_id = var("AZURE_SUBSCRIPTION_ID")?;
99
let creds = EnvironmentCredential::default();
10-
let res = creds.get_token("https://management.azure.com/").await?;
10+
let res = creds
11+
.get_token(&["https://management.azure.com/.default"])
12+
.await?;
1113
eprintln!("Azure cli response == {res:?}");
1214
// Let's enumerate the Azure storage accounts
1315
// in the subscription. Note: this way of calling the REST API

sdk/identity/src/authorization_code_flow.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use azure_core::{
77
error::{ErrorKind, ResultExt},
88
HttpClient, Url,
99
};
10-
use oauth2::basic::BasicClient;
10+
use oauth2::{basic::BasicClient, Scope};
1111
use oauth2::{ClientId, ClientSecret};
1212
use std::sync::Arc;
1313

@@ -20,7 +20,7 @@ pub fn start(
2020
client_secret: Option<ClientSecret>,
2121
tenant_id: &str,
2222
redirect_url: Url,
23-
resource: &str,
23+
scopes: &[&str],
2424
) -> AuthorizationCodeFlow {
2525
let auth_url = oauth2::AuthUrl::from_url(
2626
Url::parse(&format!(
@@ -46,10 +46,12 @@ pub fn start(
4646
// Create a PKCE code verifier and SHA-256 encode it as a code challenge.
4747
let (pkce_code_challenge, pkce_code_verifier) = oauth2::PkceCodeChallenge::new_random_sha256();
4848

49+
let scopes = scopes.iter().map(|s| Scope::new(s.to_string()));
50+
4951
// Generate the authorization URL to which we'll redirect the user.
5052
let (authorize_url, csrf_state) = client
5153
.authorize_url(oauth2::CsrfToken::new_random)
52-
.add_extra_param("scope", resource)
54+
.add_scopes(scopes)
5355
.set_pkce_challenge(pkce_code_challenge)
5456
.url();
5557

0 commit comments

Comments
 (0)