summaryrefslogtreecommitdiffstats
path: root/src/models/auth.rs
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2022-10-17 20:08:09 +0000
committerSanto Cariotti <santo@dcariotti.me>2022-10-17 20:08:09 +0000
commit74976dab57887a4d7e29b426cdf7422722fa58ee (patch)
tree5f1bbed3dbcf3ba520866cb4eb060aaf5a771915 /src/models/auth.rs
parent611293122213f83e82d851cd8dc83fd1e4f79dcd (diff)
Refactoring of mods
Diffstat (limited to 'src/models/auth.rs')
-rw-r--r--src/models/auth.rs122
1 files changed, 0 insertions, 122 deletions
diff --git a/src/models/auth.rs b/src/models/auth.rs
deleted file mode 100644
index 8a673dd..0000000
--- a/src/models/auth.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-use crate::errors::AppError;
-use axum::{
- async_trait,
- extract::{FromRequest, RequestParts, TypedHeader},
- headers::{authorization::Bearer, Authorization},
-};
-use chrono::{Duration, Local};
-use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};
-use once_cell::sync::Lazy;
-use serde::{Deserialize, Serialize};
-
-struct Keys {
- encoding: EncodingKey,
- decoding: DecodingKey,
-}
-
-/// Claims struct
-#[derive(Serialize, Deserialize)]
-pub struct Claims {
- /// ID from the user model
- pub user_id: i32,
- /// Expiration timestamp
- exp: usize,
-}
-
-/// Body used as response to login
-#[derive(Serialize)]
-pub struct AuthBody {
- /// Access token string
- access_token: String,
- /// "Bearer" string
- token_type: String,
-}
-
-/// Payload used for login
-#[derive(Deserialize)]
-pub struct LoginCredentials {
- pub username: String,
- pub password: String,
-}
-
-/// Paylod used for user creation
-#[derive(Deserialize)]
-pub struct SignUpForm {
- pub name: String,
- pub email: String,
- pub username: String,
- pub password1: String,
- pub password2: String,
-}
-
-static KEYS: Lazy<Keys> = Lazy::new(|| {
- let secret = &crate::config::CONFIG.jwt_secret;
- Keys::new(secret.as_bytes())
-});
-
-impl Keys {
- fn new(secret: &[u8]) -> Self {
- Self {
- encoding: EncodingKey::from_secret(secret),
- decoding: DecodingKey::from_secret(secret),
- }
- }
-}
-
-impl Claims {
- /// Create a new Claim using the `user_id` and the current timestamp + 2 days
- pub fn new(user_id: i32) -> Self {
- let expiration = Local::now() + Duration::days(1);
-
- Self {
- user_id,
- exp: expiration.timestamp() as usize,
- }
- }
-
- /// Returns the token as a string. If a token is not encoded, raises an
- /// `AppError::TokenCreation`
- pub fn get_token(&self) -> Result<String, AppError> {
- let token = encode(&Header::default(), &self, &KEYS.encoding)
- .map_err(|_| AppError::TokenCreation)?;
-
- Ok(token)
- }
-}
-
-impl AuthBody {
- pub fn new(access_token: String) -> Self {
- Self {
- access_token,
- token_type: "Bearer".to_string(),
- }
- }
-}
-
-/// Parse a request to get the Authorization header and then decode it checking its validation
-#[async_trait]
-impl<B> FromRequest<B> for Claims
-where
- B: Send,
-{
- type Rejection = AppError;
-
- async fn from_request(req: &mut RequestParts<B>) -> Result<Self, Self::Rejection> {
- // Extract the token from the authorization header
- let TypedHeader(Authorization(bearer)) =
- TypedHeader::<Authorization<Bearer>>::from_request(req)
- .await
- .map_err(|_| AppError::InvalidToken)?;
- // Decode the user data
- let token_data = decode::<Claims>(bearer.token(), &KEYS.decoding, &Validation::default())
- .map_err(|_| AppError::InvalidToken)?;
-
- let now = Local::now().timestamp() as usize;
-
- if token_data.claims.exp < now {
- return Err(AppError::InvalidToken);
- }
-
- Ok(token_data.claims)
- }
-}