daoyi_cloud_common/common_hoops/
jwt.rs

1use anyhow::Result;
2use jsonwebtoken::{decode, Algorithm, DecodingKey, EncodingKey, Validation};
3use salvo::jwt_auth::{ConstDecoder, CookieFinder, HeaderFinder, QueryFinder};
4use salvo::prelude::*;
5use serde::{Deserialize, Serialize};
6use time::{Duration, OffsetDateTime};
7
8use crate::config::{self, JwtConfig};
9
10#[derive(Debug, Serialize, Deserialize)]
11pub struct JwtClaims {
12    uid: String,
13    exp: i64,
14}
15
16pub fn auth_hoop(config: &JwtConfig) -> JwtAuth<JwtClaims, ConstDecoder> {
17    JwtAuth::new(ConstDecoder::from_secret(
18        config.secret.to_owned().as_bytes(),
19    ))
20    .finders(vec![
21        Box::new(HeaderFinder::new()),
22        Box::new(QueryFinder::new("token")),
23        Box::new(CookieFinder::new("jwt_token")),
24    ])
25    .force_passed(false)
26}
27
28pub fn get_token(uid: impl Into<String>) -> Result<(String, i64)> {
29    let exp = OffsetDateTime::now_utc() + Duration::seconds(config::get().jwt.expiry);
30    let claim = JwtClaims {
31        uid: uid.into(),
32        exp: exp.unix_timestamp(),
33    };
34    let token: String = jsonwebtoken::encode(
35        &jsonwebtoken::Header::default(),
36        &claim,
37        &EncodingKey::from_secret(config::get().jwt.secret.as_bytes()),
38    )?;
39    Ok((token, exp.unix_timestamp()))
40}
41
42#[allow(dead_code)]
43pub fn decode_token(token: &str) -> bool {
44    let validation = Validation::new(Algorithm::HS256);
45    decode::<JwtClaims>(
46        token,
47        &DecodingKey::from_secret(config::get().jwt.secret.as_bytes()),
48        &validation,
49    )
50    .is_ok()
51}