1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use crate::{blocks::Context, UserError}; use chrono::{prelude::*, Duration}; use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation}; use log::error; use serde::{Deserialize, Serialize}; pub fn require_token(context: &Context) -> Result<String, UserError> { match &context.auth_token { None => Err(UserError::NeedAuth), Some(token) => Ok(token.clone()), } } pub fn create_token(user_id: i32) -> String { let claims = Claims { sub: user_id.to_string(), iat: Utc::now().timestamp() as usize, exp: (Utc::now() + Duration::days(21)).timestamp() as usize, }; encode( &Header::default(), &claims, &EncodingKey::from_secret(get_secret().as_ref()), ) .unwrap() } pub fn validate_token(token: String) -> Result<i32, UserError> { let token = decode::<Claims>( &token, &DecodingKey::from_secret(get_secret().as_ref()), &Validation::default(), )?; Ok(token.claims.sub.parse()?) } pub fn get_secret() -> String { dotenv::dotenv().ok(); match std::env::var("SESSION_SECRET") { Ok(scrt) => scrt, Err(_) => { error!("A 'SESSION_SECRET' environment variable is required."); panic!() } } } #[derive(Debug, Serialize, Deserialize)] pub struct Claims { sub: String, exp: usize, iat: usize, }