Skip to main content

steer_auth_plugin/
storage.rs

1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3use std::time::SystemTime;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct OAuth2Token {
7    pub access_token: String,
8    pub refresh_token: String,
9    pub expires_at: SystemTime,
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub id_token: Option<String>,
12}
13
14// Alias for backwards compatibility
15pub type AuthTokens = OAuth2Token;
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18#[serde(tag = "type")]
19pub enum Credential {
20    #[serde(alias = "AuthTokens")]
21    OAuth2(OAuth2Token),
22    ApiKey {
23        value: String,
24    },
25}
26
27impl Credential {
28    pub fn credential_type(&self) -> CredentialType {
29        match self {
30            Credential::OAuth2(_) => CredentialType::OAuth2,
31            Credential::ApiKey { .. } => CredentialType::ApiKey,
32        }
33    }
34}
35
36#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
37pub enum CredentialType {
38    #[serde(alias = "AuthTokens")]
39    OAuth2,
40    ApiKey,
41}
42
43impl std::fmt::Display for CredentialType {
44    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45        match self {
46            CredentialType::OAuth2 => write!(f, "OAuth2"),
47            CredentialType::ApiKey => write!(f, "ApiKey"),
48        }
49    }
50}
51
52#[async_trait]
53pub trait AuthStorage: Send + Sync {
54    async fn get_credential(
55        &self,
56        provider: &str,
57        credential_type: CredentialType,
58    ) -> crate::error::Result<Option<Credential>>;
59    async fn set_credential(
60        &self,
61        provider: &str,
62        credential: Credential,
63    ) -> crate::error::Result<()>;
64    async fn remove_credential(
65        &self,
66        provider: &str,
67        credential_type: CredentialType,
68    ) -> crate::error::Result<()>;
69}