use crate::{PasetoAuth, AuthPayload};
use ferrox_errors::AppError;
use secrecy::Secret;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub struct DualTokens {
pub access_token: String,
pub refresh_token: String,
}
pub struct DualTokenManager {
paseto: PasetoAuth,
}
impl DualTokenManager {
pub fn new(secret_key: Secret<String>) -> Self {
Self {
paseto: PasetoAuth::new(secret_key).unwrap(),
}
}
pub fn generate_tokens(&self, payload: &AuthPayload) -> Result<DualTokens, AppError> {
let access_token = self.paseto.generate_token(payload, time::Duration::minutes(15))?;
use rand::RngCore;
let mut key = [0u8; 32];
rand::thread_rng().fill_bytes(&mut key);
let refresh_token = hex::encode(key);
Ok(DualTokens {
access_token,
refresh_token,
})
}
pub fn verify_access_token(&self, token: &str) -> Result<String, AppError> {
let claims = self.paseto.validate_token(token)?;
Ok(claims.user_id)
}
}