Files
imphnen-backend-service/imphnen-libs/src/jsonwebtoken/mod.rs
T

91 lines
2.5 KiB
Rust
Raw Normal View History

2025-03-13 23:40:16 +07:00
use super::Env;
2025-02-07 22:26:32 +07:00
use axum::http::StatusCode;
use chrono::{Duration, TimeDelta, Utc};
2025-02-16 01:09:55 +07:00
use jsonwebtoken::{
decode, encode, DecodingKey, EncodingKey, Header, TokenData, Validation,
};
2025-02-07 22:26:32 +07:00
use serde::{Deserialize, Serialize};
2025-03-13 23:40:16 +07:00
2025-02-07 22:26:32 +07:00
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Claims {
2025-02-16 01:09:55 +07:00
pub exp: usize,
pub iat: usize,
2025-03-15 01:53:20 +07:00
pub sub: String,
2025-02-07 22:26:32 +07:00
}
2025-03-15 01:53:20 +07:00
pub fn encode_access_token(sub: String) -> Result<String, StatusCode> {
2025-03-13 23:40:16 +07:00
let env = Env::new();
let secret: String = env.access_token_secret;
2025-02-16 01:09:55 +07:00
let now = Utc::now();
let expire: TimeDelta = Duration::minutes(15);
let exp: usize = (now + expire).timestamp() as usize;
let iat: usize = now.timestamp() as usize;
2025-03-13 23:40:16 +07:00
let claim = Claims { iat, exp, sub };
2025-02-16 01:09:55 +07:00
encode(
&Header::default(),
&claim,
&EncodingKey::from_secret(secret.as_ref()),
)
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
2025-02-07 22:26:32 +07:00
}
2025-03-23 01:19:17 +07:00
pub fn encode_reset_password_token(sub: String) -> Result<String, StatusCode> {
let env = Env::new();
let secret: String = env.access_token_secret;
let now = Utc::now();
let expire: TimeDelta = Duration::minutes(5);
let exp: usize = (now + expire).timestamp() as usize;
let iat: usize = now.timestamp() as usize;
let claim = Claims { iat, exp, sub };
encode(
&Header::default(),
&claim,
&EncodingKey::from_secret(secret.as_ref()),
)
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
}
2025-02-16 01:09:55 +07:00
pub fn decode_access_token(
jwt_token: &str,
) -> Result<TokenData<Claims>, StatusCode> {
2025-03-13 23:40:16 +07:00
let env = Env::new();
let secret: String = env.access_token_secret;
2025-02-16 01:09:55 +07:00
let result: Result<TokenData<Claims>, StatusCode> = decode(
&jwt_token,
&DecodingKey::from_secret(secret.as_ref()),
&Validation::default(),
)
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR);
result
2025-02-07 22:26:32 +07:00
}
2025-03-15 01:53:20 +07:00
pub fn encode_refresh_token(sub: String) -> Result<String, StatusCode> {
2025-03-13 23:40:16 +07:00
let env = Env::new();
let secret: String = env.refresh_token_secret;
2025-02-16 01:09:55 +07:00
let now = Utc::now();
let expire: TimeDelta = Duration::days(1);
let exp: usize = (now + expire).timestamp() as usize;
let iat: usize = now.timestamp() as usize;
2025-03-13 23:40:16 +07:00
let claim = Claims { iat, exp, sub };
2025-02-16 01:09:55 +07:00
encode(
&Header::default(),
&claim,
&EncodingKey::from_secret(secret.as_ref()),
)
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
2025-02-07 22:26:32 +07:00
}
2025-02-16 01:09:55 +07:00
pub fn decode_refresh_token(
jwt_token: &str,
) -> Result<TokenData<Claims>, StatusCode> {
2025-03-13 23:40:16 +07:00
let env = Env::new();
let secret: String = env.refresh_token_secret;
2025-02-16 01:09:55 +07:00
let result: Result<TokenData<Claims>, StatusCode> = decode(
&jwt_token,
&DecodingKey::from_secret(secret.as_ref()),
&Validation::default(),
)
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR);
result
2025-02-07 22:26:32 +07:00
}