feat: 完善生产级 Rust Web 模板
This commit is contained in:
+30
-1
@@ -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"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user