use arcgis::{AuthProvider, ClientCredentialsAuth};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.init();
tracing::info!("🔐 ArcGIS OAuth 2.0 Client Credentials Flow Example");
tracing::info!("✨ Fully automated - no browser interaction required!");
tracing::info!("📋 Creating OAuth Client Credentials authenticator from environment");
let auth = ClientCredentialsAuth::from_env()?;
tracing::info!("✅ Authenticator created");
tracing::info!("🔑 Fetching access token");
let token = auth.get_token().await?;
tracing::info!(
token_preview = %&token[..20.min(token.len())],
"✅ Access token obtained"
);
tracing::info!("🔄 Getting token again (should use cache)");
let token2 = auth.get_token().await?;
let tokens_match = token == token2;
tracing::info!(tokens_match = tokens_match, "✅ Token retrieved from cache");
tracing::info!("📊 Token Information:");
tracing::info!(
token_length = token.len(),
token_type = "Bearer",
lifetime = "~2 hours",
"Token details"
);
tracing::info!("🎉 Authentication successful!");
tracing::info!("💡 The ClientCredentialsAuth is now authenticated and can be");
tracing::info!(" used with ArcGISClient to make authenticated API requests");
tracing::info!("📝 Token will automatically refresh when it expires");
tracing::info!(" No manual token management required!");
tracing::info!("🚀 Example usage:");
tracing::info!(" let client = ArcGISClient::new(auth);");
tracing::info!(" // All API calls automatically use refreshed tokens");
Ok(())
}