1use async_trait::async_trait;
2use thiserror::Error;
3
4use crate::storage::StorageBackend;
5
6#[derive(Debug, Error)]
7pub enum AuthError {
8 #[error("invalid credentials")]
9 InvalidCredentials,
10 #[error("invalid request: {0}")]
11 InvalidRequest(String),
12 #[error("storage error: {0}")]
13 Storage(#[from] crate::storage::StorageError),
14 #[error("auth error: {0}")]
15 Other(String),
16}
17
18pub type AuthResult<T> = Result<T, AuthError>;
19
20pub enum LoginRequest {
21 UserPass { username: String, password: String },
22 OidcAuthCodeCallback { code: String, state: String },
23 OidcBearerJwt { jwt: String },
24}
25
26pub struct AuthOutcome {
27 pub policies: Vec<String>,
28 pub display_name: String,
29 pub ttl_seconds: Option<i64>,
30}
31
32#[async_trait]
33pub trait AuthMethod: Send + Sync {
34 async fn login(
35 &self,
36 storage: &dyn StorageBackend,
37 request: LoginRequest,
38 ) -> AuthResult<AuthOutcome>;
39}