webdav_server/api/auth/
login.rs1use crate::error::Result;
2use crate::logger::Module;
3use crate::model::session::Session;
4use crate::model::user::User;
5use crate::{
6 api::Error::{BadRequest, Unauthorized},
7 app::State as AppState,
8};
9use crate::{info, warn};
10use axum::Json;
11use axum::extract::State;
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Serialize)]
16pub struct LoginResponse {
17 pub token: String,
22}
23
24#[derive(Deserialize)]
26pub struct LoginRequest {
27 identity_hash: String,
29 auth_verifier: String,
31}
32
33pub async fn login(
43 State(state): State<AppState>,
44 Json(request): Json<LoginRequest>,
45) -> Result<Json<LoginResponse>> {
46 let Ok(identity_hash) = hex::decode(&request.identity_hash) else {
47 Err(BadRequest("identity_hash failed to decode".into()))?
48 };
49
50 let user_id = User::verify(&state.db, identity_hash, request.auth_verifier)
51 .await?
52 .ok_or_else(|| {
53 warn!(
54 Module::Api,
55 "Failed login attempt with id : ''",
56 );
58 Unauthorized("Invalid Credentials".into())
59 })?;
60
61 let token = Session::create(&state.db, user_id).await?;
62
63 info!(Module::Api, "User {user_id} successfully logged in");
64 Ok(Json(LoginResponse { token }))
65}