All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 10m26s
49 lines
1.6 KiB
Rust
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,
|
|
}))
|
|
}
|