jwt.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. use jsonwebtoken::{decode, encode, Algorithm, DecodingKey, EncodingKey, Header, Validation};
  2. use once_cell::sync::Lazy;
  3. use serde::{Deserialize, Serialize};
  4. use std::env;
  5. pub static SECRET: Lazy<String> =
  6. Lazy::new(|| env::var("RUSTDESK_API_JWT_KEY").unwrap_or_else(|_| "".to_string()));
  7. // 定义一个结构体来表示 JWT 的 payload
  8. #[derive(Debug, Serialize, Deserialize)]
  9. pub struct Claims {
  10. user_id: u32,
  11. exp: usize,
  12. }
  13. pub fn generate_token(user_id: u32, exp: i64) -> Result<String, String> {
  14. println!("secret: {:}", SECRET.to_string());
  15. let claims = Claims {
  16. user_id,
  17. exp: (chrono::Utc::now() + chrono::Duration::seconds(exp)).timestamp() as usize,
  18. };
  19. let token = encode(
  20. &Header::default(),
  21. &claims,
  22. &EncodingKey::from_secret(SECRET.as_ref()),
  23. );
  24. match token {
  25. Ok(t) => Ok(t),
  26. Err(e) => Err(e.to_string()),
  27. }
  28. }
  29. // 验证 JWT 的函数
  30. pub fn verify_token(token: &str) -> Result<Claims, String> {
  31. // 解码 JWT
  32. let validation = Validation::new(Algorithm::HS256);
  33. let decoded = decode::<Claims>(
  34. &token,
  35. &DecodingKey::from_secret(SECRET.as_ref()),
  36. &validation,
  37. );
  38. match decoded {
  39. Ok(token_data) => {
  40. let now = chrono::Utc::now().timestamp() as usize;
  41. if token_data.claims.exp > now {
  42. Ok(token_data.claims)
  43. } else {
  44. Err("Token status invalid or expired".to_string())
  45. }
  46. }
  47. Err(_) => Err("Invalid token".to_string()),
  48. }
  49. }