Skip to main content

quokka_admin/service/
db_login_provider.rs

1use 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}