Add detailed logging to login handler and use full page reload for auth navigation
All checks were successful
Build MIPS Binary / build (push) Successful in 4m7s
All checks were successful
Build MIPS Binary / build (push) Successful in 4m7s
This commit is contained in:
@@ -36,11 +36,16 @@ pub async fn login_handler(
|
|||||||
jar: CookieJar,
|
jar: CookieJar,
|
||||||
Json(payload): Json<LoginRequest>,
|
Json(payload): Json<LoginRequest>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
|
tracing::info!("Login attempt for user: {}", payload.username);
|
||||||
|
|
||||||
let user = match state.db.get_user_by_username(&payload.username).await {
|
let user = match state.db.get_user_by_username(&payload.username).await {
|
||||||
Ok(Some(u)) => u,
|
Ok(Some(u)) => u,
|
||||||
Ok(None) => return (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response(),
|
Ok(None) => {
|
||||||
|
tracing::warn!("Login failed: User not found for {}", payload.username);
|
||||||
|
return (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response();
|
||||||
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::error!("DB error during login: {}", e);
|
tracing::error!("DB error during login for {}: {}", payload.username, e);
|
||||||
return (StatusCode::INTERNAL_SERVER_ERROR, "Database error").into_response();
|
return (StatusCode::INTERNAL_SERVER_ERROR, "Database error").into_response();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -49,6 +54,8 @@ pub async fn login_handler(
|
|||||||
|
|
||||||
match bcrypt::verify(&payload.password, &password_hash) {
|
match bcrypt::verify(&payload.password, &password_hash) {
|
||||||
Ok(true) => {
|
Ok(true) => {
|
||||||
|
tracing::info!("Password verified for user: {}", payload.username);
|
||||||
|
|
||||||
// Create session
|
// Create session
|
||||||
let token: String = (0..32).map(|_| {
|
let token: String = (0..32).map(|_| {
|
||||||
use rand::{distributions::Alphanumeric, Rng};
|
use rand::{distributions::Alphanumeric, Rng};
|
||||||
@@ -60,7 +67,7 @@ pub async fn login_handler(
|
|||||||
let expires_at = time::OffsetDateTime::now_utc().unix_timestamp() + expires_in;
|
let expires_at = time::OffsetDateTime::now_utc().unix_timestamp() + expires_in;
|
||||||
|
|
||||||
if let Err(e) = state.db.create_session(user_id, &token, expires_at).await {
|
if let Err(e) = state.db.create_session(user_id, &token, expires_at).await {
|
||||||
tracing::error!("Failed to create session: {}", e);
|
tracing::error!("Failed to create session for {}: {}", payload.username, e);
|
||||||
return (StatusCode::INTERNAL_SERVER_ERROR, "Failed to create session").into_response();
|
return (StatusCode::INTERNAL_SERVER_ERROR, "Failed to create session").into_response();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,9 +78,17 @@ pub async fn login_handler(
|
|||||||
.max_age(Duration::seconds(expires_in))
|
.max_age(Duration::seconds(expires_in))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
tracing::info!("Session created and cookie set for user: {}", payload.username);
|
||||||
(StatusCode::OK, jar.add(cookie), "Login successful").into_response()
|
(StatusCode::OK, jar.add(cookie), "Login successful").into_response()
|
||||||
}
|
}
|
||||||
_ => (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response(),
|
Ok(false) => {
|
||||||
|
tracing::warn!("Login failed: Invalid password for {}", payload.username);
|
||||||
|
(StatusCode::UNAUTHORIZED, "Invalid credentials").into_response()
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
tracing::error!("Bcrypt error for {}: {}", payload.username, e);
|
||||||
|
(StatusCode::INTERNAL_SERVER_ERROR, "Auth error").into_response()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ pub fn Login() -> impl IntoView {
|
|||||||
set_loading.set(true);
|
set_loading.set(true);
|
||||||
set_error.set(None);
|
set_error.set(None);
|
||||||
|
|
||||||
|
logging::log!("Attempting login for user: {}", username.get());
|
||||||
|
|
||||||
spawn_local(async move {
|
spawn_local(async move {
|
||||||
let req = LoginRequest {
|
let req = LoginRequest {
|
||||||
username: username.get(),
|
username: username.get(),
|
||||||
@@ -32,15 +34,19 @@ pub fn Login() -> impl IntoView {
|
|||||||
|
|
||||||
match client.send().await {
|
match client.send().await {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
|
logging::log!("Login response status: {}", resp.status());
|
||||||
if resp.ok() {
|
if resp.ok() {
|
||||||
// Redirect to home on success
|
logging::log!("Login successful, redirecting...");
|
||||||
let navigate = use_navigate();
|
// Force a full reload to re-run auth checks in App.rs
|
||||||
navigate("/", Default::default());
|
let _ = window().location().set_href("/");
|
||||||
} else {
|
} else {
|
||||||
|
let text = resp.text().await.unwrap_or_default();
|
||||||
|
logging::error!("Login failed: {}", text);
|
||||||
set_error.set(Some("Kullanıcı adı veya şifre hatalı".to_string()));
|
set_error.set(Some("Kullanıcı adı veya şifre hatalı".to_string()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(e) => {
|
||||||
|
logging::error!("Network error: {}", e);
|
||||||
set_error.set(Some("Bağlantı hatası".to_string()));
|
set_error.set(Some("Bağlantı hatası".to_string()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,9 +49,8 @@ pub fn Setup() -> impl IntoView {
|
|||||||
match client.send().await {
|
match client.send().await {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
if resp.ok() {
|
if resp.ok() {
|
||||||
// Redirect to login after setup
|
// Redirect to login after setup (full reload to be safe)
|
||||||
let navigate = use_navigate();
|
let _ = window().location().set_href("/login");
|
||||||
navigate("/login", Default::default());
|
|
||||||
} else {
|
} else {
|
||||||
let text = resp.text().await.unwrap_or_default();
|
let text = resp.text().await.unwrap_or_default();
|
||||||
set_error.set(Some(format!("Hata: {}", text)));
|
set_error.set(Some(format!("Hata: {}", text)));
|
||||||
|
|||||||
Reference in New Issue
Block a user