feat: 完善生产级 Rust Web 模板

This commit is contained in:
2026-07-21 16:00:03 +08:00
parent fb30d5da1a
commit ce89569bf3
58 changed files with 2042 additions and 349 deletions
+30 -1
View File
@@ -75,6 +75,7 @@ impl TokenService {
}
/// 从 token 中解码出 user_id
#[allow(dead_code)]
pub fn decode_user_id(token: &str, jwt_secret: &str) -> Result<String> {
let token_data = decode::<Claims>(
token,
@@ -85,6 +86,18 @@ impl TokenService {
Ok(token_data.claims.sub)
}
pub fn decode_refresh_user_id(token: &str, jwt_secret: &str) -> Result<String> {
let token_data = decode::<Claims>(
token,
&DecodingKey::from_secret(jwt_secret.as_ref()),
&Validation::default(),
)?;
if token_data.claims.token_type != TokenType::Refresh {
anyhow::bail!("Token 类型无效");
}
Ok(token_data.claims.sub)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -94,8 +107,24 @@ pub struct Claims {
pub token_type: TokenType,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TokenType {
Access,
Refresh,
}
#[cfg(test)]
mod tests {
use super::*;
const SECRET: &str = "a-test-secret-that-is-long-enough";
#[test]
fn token_pair_keeps_subject_and_type() {
let (access, refresh) = TokenService::generate_token_pair("42", 5, 1, SECRET).unwrap();
assert_eq!(TokenService::decode_user_id(&access, SECRET).unwrap(), "42");
assert!(TokenService::decode_refresh_user_id(&access, SECRET).is_err());
assert_eq!(
TokenService::decode_refresh_user_id(&refresh, SECRET).unwrap(),
"42"
);
}
}