daoyi_cloud_common/common_hoops/
jwt.rs1use 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}