2025-07-31 15:07:18 +07:00
|
|
|
use crate::enviroment::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::{
|
2025-07-21 21:29:04 +07:00
|
|
|
DecodingKey, EncodingKey, Header, TokenData, Validation, decode, encode,
|
2025-02-16 01:09:55 +07:00
|
|
|
};
|
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-08-14 22:46:42 +07:00
|
|
|
pub user_id: String,
|
|
|
|
|
pub permissions: Vec<String>,
|
2025-02-07 22:26:32 +07:00
|
|
|
}
|
|
|
|
|
|
2025-08-14 22:46:42 +07:00
|
|
|
pub fn encode_access_token(sub: String, user_id: String, permissions: Vec<String>) -> Result<String, StatusCode> {
|
2025-07-31 15:07:18 +07:00
|
|
|
let env = &ENV;
|
|
|
|
|
let secret: String = env.access_token_secret.clone();
|
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-08-14 22:46:42 +07:00
|
|
|
let claim = Claims { iat, exp, sub, user_id, permissions };
|
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-08-14 22:46:42 +07:00
|
|
|
pub fn encode_reset_password_token(sub: String, user_id: String, permissions: Vec<String>) -> Result<String, StatusCode> {
|
2025-07-31 15:07:18 +07:00
|
|
|
let env = &ENV;
|
|
|
|
|
let secret: String = env.access_token_secret.clone();
|
2025-03-23 01:19:17 +07:00
|
|
|
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;
|
2025-08-14 22:46:42 +07:00
|
|
|
let claim = Claims { iat, exp, sub, user_id, permissions };
|
2025-03-23 01:19:17 +07:00
|
|
|
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-07-31 15:07:18 +07:00
|
|
|
let env = &ENV;
|
|
|
|
|
let secret: String = env.access_token_secret.clone();
|
2025-02-16 01:09:55 +07:00
|
|
|
let result: Result<TokenData<Claims>, StatusCode> = decode(
|
2025-07-21 21:29:04 +07:00
|
|
|
jwt_token,
|
2025-02-16 01:09:55 +07:00
|
|
|
&DecodingKey::from_secret(secret.as_ref()),
|
|
|
|
|
&Validation::default(),
|
|
|
|
|
)
|
|
|
|
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR);
|
|
|
|
|
result
|
2025-02-07 22:26:32 +07:00
|
|
|
}
|
|
|
|
|
|
2025-08-14 22:46:42 +07:00
|
|
|
pub fn encode_refresh_token(sub: String, user_id: String, permissions: Vec<String>) -> Result<String, StatusCode> {
|
2025-07-31 15:07:18 +07:00
|
|
|
let env = &ENV;
|
|
|
|
|
let secret: String = env.refresh_token_secret.clone();
|
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-08-14 22:46:42 +07:00
|
|
|
let claim = Claims { iat, exp, sub, user_id, permissions };
|
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-07-31 15:07:18 +07:00
|
|
|
let env = &ENV;
|
|
|
|
|
let secret: String = env.refresh_token_secret.clone();
|
2025-02-16 01:09:55 +07:00
|
|
|
let result: Result<TokenData<Claims>, StatusCode> = decode(
|
2025-07-21 21:29:04 +07:00
|
|
|
jwt_token,
|
2025-02-16 01:09:55 +07:00
|
|
|
&DecodingKey::from_secret(secret.as_ref()),
|
|
|
|
|
&Validation::default(),
|
|
|
|
|
)
|
|
|
|
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR);
|
2025-08-11 22:31:51 +07:00
|
|
|
result // Explicitly return result
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-14 22:46:42 +07:00
|
|
|
pub fn generate_jwt(user_id: &str, permissions: Vec<String>) -> Result<String, StatusCode> {
|
|
|
|
|
encode_access_token(user_id.to_string(), user_id.to_string(), permissions)
|
2025-02-07 22:26:32 +07:00
|
|
|
}
|