Skip to main content

token_refresh/
token_refresh.rs

1use baidu_netdisk_sdk::auth::AccessToken;
2use baidu_netdisk_sdk::BaiduNetDiskClient;
3use std::time::SystemTime;
4use std::time::UNIX_EPOCH;
5
6#[tokio::main]
7async fn main() -> Result<(), Box<dyn std::error::Error>> {
8    // Initialize logger
9    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("debug")).init();
10
11    println!("=== Token Refresh Test ===");
12    println!();
13
14    // Create client with auto-refresh enabled
15    let client = BaiduNetDiskClient::builder()
16        .auto_refresh(true)
17        .refresh_ahead_seconds(60)
18        .build()?;
19
20    println!("Client created successfully");
21    println!();
22
23    // Step 1: Load token from environment
24    println!("Step 1: Loading token from environment...");
25    client.load_token_from_env()?;
26    println!("Token loaded successfully");
27
28    let original_token = client.get_valid_token().await?;
29    println!("Original Token: {:?}", original_token);
30    println!();
31
32    // Step 2: Test manual refresh
33    println!("Step 2: Testing manual token refresh...");
34    match client.token_provider().refresh_token().await {
35        Ok(new_token) => {
36            println!("✓ Token refreshed successfully!");
37            println!("  New Access Token: {}", new_token.access_token);
38            println!("  New Refresh Token: {}", new_token.refresh_token);
39            println!("  Expires in: {} seconds", new_token.expires_in);
40            println!();
41
42            // Verify the tokens are different
43            if new_token.access_token != original_token.access_token {
44                println!("✓ Access token changed after refresh");
45            } else {
46                println!("✗ Access token remains the same");
47            }
48
49            // Verify refresh token may have changed
50            if new_token.refresh_token != original_token.refresh_token {
51                println!("✓ Refresh token changed after refresh");
52            } else {
53                println!("Note: Refresh token remains the same (may be expected)");
54            }
55        }
56        Err(e) => {
57            println!("✗ Failed to refresh token: {}", e);
58            println!("Note: This may be due to invalid credentials or network issues");
59        }
60    }
61
62    println!();
63
64    // Step 3: Test auto-refresh with expired token simulation
65    println!("Step 3: Testing auto-refresh behavior...");
66
67    // Create an expired token to test auto-refresh
68    let expired_token = AccessToken {
69        access_token: "expired_access_token".to_string(),
70        expires_in: 60,                                      // 60 seconds
71        refresh_token: original_token.refresh_token.clone(), // Use real refresh token
72        scope: "basic netdisk".to_string(),
73        session_key: "".to_string(),
74        session_secret: "".to_string(),
75        acquired_at: SystemTime::now()
76            .duration_since(UNIX_EPOCH)
77            .unwrap_or_default()
78            .as_secs()
79            - 3600, // 1 hour ago (expired)
80    };
81
82    client.set_access_token(expired_token)?;
83
84    // Now try to get valid token - should trigger auto-refresh
85    match client.get_valid_token().await {
86        Ok(refreshed_token) => {
87            println!("✓ Auto-refresh triggered successfully!");
88            println!("  New Access Token: {}", refreshed_token.access_token);
89            println!(
90                "  Expires in: {} seconds",
91                refreshed_token.remaining_seconds()
92            );
93        }
94        Err(e) => {
95            println!("✗ Auto-refresh failed: {}", e);
96            println!("Note: This may be due to invalid credentials");
97        }
98    }
99
100    println!();
101    println!("=== Refresh test completed ===");
102    Ok(())
103}