block on hashing

This commit is contained in:
jb-alvarado 2023-12-11 13:27:22 +01:00
parent 15f41148df
commit 4c4199cbdb
2 changed files with 51 additions and 35 deletions

View File

@ -32,6 +32,7 @@ use regex::Regex;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use simplelog::*; use simplelog::*;
use sqlx::{Pool, Sqlite}; use sqlx::{Pool, Sqlite};
use tokio::task;
use crate::db::{ use crate::db::{
handles, handles,
@ -160,40 +161,48 @@ pub async fn login(pool: web::Data<Pool<Sqlite>>, credentials: web::Json<User>)
let conn = pool.into_inner(); let conn = pool.into_inner();
match handles::select_login(&conn, &credentials.username).await { match handles::select_login(&conn, &credentials.username).await {
Ok(mut user) => { Ok(mut user) => {
let pass = user.password.clone(); let role = handles::select_role(&conn, &user.role_id.unwrap_or_default())
let hash = PasswordHash::new(&pass).unwrap(); .await
user.password = "".into(); .unwrap_or(Role::Guest);
if Argon2::default() let res = task::spawn_blocking(move || {
.verify_password(credentials.password.as_bytes(), &hash) let pass = user.password.clone();
.is_ok() let hash = PasswordHash::new(&pass).unwrap();
{ user.password = "".into();
let role = handles::select_role(&conn, &user.role_id.unwrap_or_default())
.await
.unwrap_or(Role::Guest);
let claims = Claims::new(user.id, user.username.clone(), role.clone());
if let Ok(token) = create_jwt(claims) { if Argon2::default()
user.token = Some(token); .verify_password(credentials.password.as_bytes(), &hash)
}; .is_ok()
{
let claims = Claims::new(user.id, user.username.clone(), role.clone());
info!("user {} login, with role: {role}", credentials.username); if let Ok(token) = create_jwt(claims) {
user.token = Some(token);
};
web::Json(UserObj { info!("user {} login, with role: {role}", credentials.username);
message: "login correct!".into(),
user: Some(user), web::Json(UserObj {
}) message: "login correct!".into(),
.customize() user: Some(user),
.with_status(StatusCode::OK) })
} else { .customize()
error!("Wrong password for {}!", credentials.username); .with_status(StatusCode::OK)
web::Json(UserObj { } else {
message: "Wrong password!".into(), error!("Wrong password for {}!", credentials.username);
user: None,
}) web::Json(UserObj {
.customize() message: "Wrong password!".into(),
.with_status(StatusCode::FORBIDDEN) user: None,
} })
.customize()
.with_status(StatusCode::FORBIDDEN)
}
})
.await
.unwrap();
res
} }
Err(e) => { Err(e) => {
error!("Login {} failed! {e}", credentials.username); error!("Login {} failed! {e}", credentials.username);

View File

@ -8,6 +8,7 @@ use argon2::{
use rand::{distributions::Alphanumeric, Rng}; use rand::{distributions::Alphanumeric, Rng};
use simplelog::*; use simplelog::*;
use sqlx::{migrate::MigrateDatabase, sqlite::SqliteQueryResult, Pool, Sqlite}; use sqlx::{migrate::MigrateDatabase, sqlite::SqliteQueryResult, Pool, Sqlite};
use tokio::task;
use crate::db::{ use crate::db::{
db_pool, db_pool,
@ -243,17 +244,23 @@ pub async fn insert_user(
conn: &Pool<Sqlite>, conn: &Pool<Sqlite>,
user: User, user: User,
) -> Result<SqliteQueryResult, sqlx::Error> { ) -> Result<SqliteQueryResult, sqlx::Error> {
let salt = SaltString::generate(&mut OsRng); let password_hash = task::spawn_blocking(move || {
let password_hash = Argon2::default() let salt = SaltString::generate(&mut OsRng);
.hash_password(user.password.clone().as_bytes(), &salt) let hash = Argon2::default()
.unwrap(); .hash_password(user.password.clone().as_bytes(), &salt)
.unwrap();
hash.to_string()
})
.await
.unwrap();
let query = "INSERT INTO user (mail, username, password, role_id) VALUES($1, $2, $3, $4)"; let query = "INSERT INTO user (mail, username, password, role_id) VALUES($1, $2, $3, $4)";
sqlx::query(query) sqlx::query(query)
.bind(user.mail) .bind(user.mail)
.bind(user.username) .bind(user.username)
.bind(password_hash.to_string()) .bind(password_hash)
.bind(user.role_id) .bind(user.role_id)
.execute(conn) .execute(conn)
.await .await