use std::sync::Arc;
use sa_token_core::{
SaTokenManager, SaTokenConfig, StpUtil,
JwtManager, JwtClaims, JwtAlgorithm,
config::TokenStyle,
};
use sa_token_storage_memory::MemoryStorage;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("========================================");
println!("sa-token JWT 功能示例 | sa-token JWT Features Example");
println!("========================================\n");
println!(">>> 示例 1: 独立使用 JWT Manager | Example 1: Use JWT Manager Independently\n");
let jwt_manager = JwtManager::new("my-secret-key-123456")
.set_issuer("sa-token-rust")
.set_audience("web-app");
let mut claims = JwtClaims::new("user_10086");
claims.set_expiration(3600); claims.set_login_type("user");
claims.set_device("web-browser");
claims.add_claim("role", serde_json::json!("admin"));
claims.add_claim("permissions", serde_json::json!(["read", "write", "delete"]));
println!("创建的 Claims:");
println!(" - 用户ID: {}", claims.login_id);
println!(" - 登录类型: {:?}", claims.login_type);
println!(" - 设备: {:?}", claims.device);
println!(" - 角色: {:?}", claims.get_claim("role"));
println!(" - 权限: {:?}\n", claims.get_claim("permissions"));
let jwt_token = jwt_manager.generate(&claims)?;
println!("生成的 JWT Token:");
println!("{}\n", jwt_token);
let decoded_claims = jwt_manager.validate(&jwt_token)?;
println!("解码的 Claims:");
println!(" - 用户ID: {}", decoded_claims.login_id);
println!(" - 剩余有效时间: {:?} 秒\n", decoded_claims.remaining_time());
println!("\n========================================");
println!(">>> 示例 2: 在 sa-token 中使用 JWT Token Style\n");
let storage = Arc::new(MemoryStorage::new());
let config = SaTokenConfig::builder()
.timeout(7200) .token_style(TokenStyle::Jwt)
.jwt_secret_key("my-super-secret-key-123456")
.jwt_algorithm("HS256")
.jwt_issuer("sa-token-rust")
.jwt_audience("mobile-app")
.build_config();
let manager = SaTokenManager::new(storage, config);
StpUtil::init_manager(manager.clone());
println!("配置信息 | Configuration:");
println!(" - Token Style: JWT");
println!(" - 算法 | Algorithm: HS256");
println!(" - 签发者 | Issuer: sa-token-rust");
println!(" - 受众 | Audience: mobile-app\n");
let token = StpUtil::login("user_10087").await?;
println!("登录成功,生成的 JWT Token | Login successful, generated JWT Token:");
println!("{}\n", token.as_str());
let is_valid = StpUtil::is_login(&token).await;
println!("Token 验证结果 | Token Validation Result: {}\n", if is_valid { "✓ 有效 | Valid" } else { "✗ 无效 | Invalid" });
println!("\n========================================");
println!(">>> 示例 3: JWT Token 刷新 | Example 3: JWT Token Refresh\n");
let jwt_manager = JwtManager::new("refresh-secret-key");
let mut short_claims = JwtClaims::new("user_10088");
short_claims.set_expiration(60); let short_token = jwt_manager.generate(&short_claims)?;
println!("原始 Token 剩余时间: {} 秒",
jwt_manager.validate(&short_token)?.remaining_time().unwrap());
let refreshed_token = jwt_manager.refresh(&short_token, 7200)?;
println!("刷新后 Token 剩余时间: {} 秒\n",
jwt_manager.validate(&refreshed_token)?.remaining_time().unwrap());
println!("\n========================================");
println!(">>> 示例 4: 支持多种算法\n");
let algorithms = vec![
(JwtAlgorithm::HS256, "HS256"),
(JwtAlgorithm::HS384, "HS384"),
(JwtAlgorithm::HS512, "HS512"),
];
for (alg, name) in algorithms {
let manager = JwtManager::with_algorithm("test-secret", alg);
let mut claims = JwtClaims::new("user_test");
claims.set_expiration(3600);
match manager.generate(&claims) {
Ok(token) => {
println!("✓ {} 算法生成成功,Token 长度: {} 字符", name, token.len());
if manager.validate(&token).is_ok() {
println!(" ✓ 验证通过");
}
}
Err(e) => println!("✗ {} 算法失败: {:?}", name, e),
}
}
println!("\n========================================");
println!(">>> 示例 5: 使用自定义 Claims\n");
let jwt_manager = JwtManager::new("custom-claims-secret");
let mut claims = JwtClaims::new("user_10089");
claims.set_expiration(3600);
claims.add_claim("username", serde_json::json!("张三"));
claims.add_claim("email", serde_json::json!("zhangsan@example.com"));
claims.add_claim("age", serde_json::json!(28));
claims.add_claim("is_premium", serde_json::json!(true));
claims.add_claim("metadata", serde_json::json!({
"last_login": "2025-01-01 10:00:00",
"login_count": 42,
"preferences": {
"theme": "dark",
"language": "zh-CN"
}
}));
let token = jwt_manager.generate(&claims)?;
let decoded = jwt_manager.validate(&token)?;
println!("自定义 Claims 内容:");
println!(" - 用户名: {:?}", decoded.get_claim("username"));
println!(" - 邮箱: {:?}", decoded.get_claim("email"));
println!(" - 年龄: {:?}", decoded.get_claim("age"));
println!(" - 是否高级用户: {:?}", decoded.get_claim("is_premium"));
println!(" - 元数据: {:?}\n", decoded.get_claim("metadata"));
println!("\n========================================");
println!(">>> 示例 6: 快速提取用户ID(不完全验证)\n");
let jwt_manager = JwtManager::new("extract-secret");
let mut claims = JwtClaims::new("quick_user_123");
claims.set_expiration(3600);
let token = jwt_manager.generate(&claims)?;
let user_id = jwt_manager.extract_login_id(&token)?;
println!("快速提取的用户ID: {}", user_id);
println!("(注意:此方法不验证签名,仅用于快速识别)\n");
println!("\n========================================");
println!("✅ JWT 功能演示完成!");
println!("========================================\n");
println!("JWT 功能特性:");
println!(" ✓ 多种算法支持(HS256, HS384, HS512, RS256等)");
println!(" ✓ 自定义 Claims");
println!(" ✓ Token 刷新");
println!(" ✓ 过期时间验证");
println!(" ✓ 签发者和受众验证");
println!(" ✓ 与 sa-token 无缝集成");
println!(" ✓ 快速用户识别");
Ok(())
}