rhythm-backend/src/service/auth_service.rs
Dmitri 02eb0d7cf5
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 10m26s
added delay anti enumeration for register
2026-04-28 21:08:10 +02:00

49 lines
1.6 KiB
Rust

use std::time::Instant;
use axum::Json;
use chrono::{Duration, Utc};
use crate::controller::model::auth_model::*;
use crate::db::repository::refresh_token_repository::create_refresh_token;
use crate::db::repository::user_repository;
use crate::errors::AppError;
use crate::state::AppState;
use crate::utils::anti_enumeration::anti_enumeration_delay;
use crate::utils::hash;
use crate::utils::jwt::generate_access_token;
use crate::utils::refresh_token::generate_refresh_token;
pub async fn login(state: &AppState, req: LoginRequest) -> Result<Json<AuthResponse>, AppError> {
todo!()
}
pub async fn register(
state: &AppState,
req: RegisterRequest,
) -> Result<Json<AuthResponse>, AppError> {
let start = Instant::now();
let mut tx = state.db.begin().await?;
{
let user = user_repository::get_user_by_email(&mut *tx, &req.email).await?;
if user.is_some() {
// user already registered
anti_enumeration_delay(start, 150, 300).await;
return Err(AppError::Internal);
}
}
let h = hash::hash(&req.password)?;
let user = user_repository::create_user(&mut *tx, req.email, h).await?;
let access_token = generate_access_token(user.id, &state.jwt_secret)?;
let (refresh_plain, refresh_hash) = generate_refresh_token();
let expires_at = chrono::Utc::now() + Duration::days(7);
create_refresh_token(&mut *tx, user.id, refresh_hash, expires_at).await?;
tx.commit().await?;
anti_enumeration_delay(start, 150, 300).await;
// TODO: put refresh token in cookie
Ok(Json(AuthResponse {
access_token: access_token,
refresh_token: refresh_plain,
}))
}