quokka_admin/service/
db_login_provider.rs1use argon2::PasswordVerifier;
2use quokka::state::FromState;
3
4use crate::{
5 entity::user::UserRepository,
6 middleware::{AdminLoginProvider, LoginData, LoginResult},
7};
8
9#[derive(Clone, FromState)]
10pub struct DbLoginProvider {
11 user_repository: UserRepository,
12}
13
14impl AdminLoginProvider for DbLoginProvider {
15 async fn do_login(&self, login_data: &LoginData) -> quokka::Result<Option<LoginResult>> {
16 let Some(user) = self
17 .user_repository
18 .get_user_by_name(&login_data.login_name)
19 .await?
20 else {
21 return Ok(None);
22 };
23
24 if argon2::Argon2::default()
25 .verify_password(
26 login_data.password.as_bytes(),
27 &argon2::PasswordHash::new(&user.password).map_err(quokka::Error::wrap_error(
28 "Unable to parse password hash",
29 500,
30 ))?,
31 )
32 .is_ok()
33 {
34 return Ok(Some(LoginResult {
35 user_identifier: user.username,
36 }));
37 }
38
39 Ok(None)
40 }
41}