use serde::{Deserialize, Serialize};
use super::signing_key::SigningKey;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthConfig {
pub required: bool,
pub token_expiry_secs: u64,
#[serde(skip)]
pub signing_key: Option<SigningKey>,
#[serde(default)]
pub issuer: Option<String>,
#[serde(default)]
pub audience: Option<String>,
#[serde(default = "default_clock_skew")]
pub clock_skew_secs: u64,
}
pub(super) const fn default_clock_skew() -> u64 {
60
}
impl AuthConfig {
#[must_use]
pub const fn permissive() -> Self {
Self {
required: false,
token_expiry_secs: 3600,
signing_key: None,
issuer: None,
audience: None,
clock_skew_secs: default_clock_skew(),
}
}
#[must_use]
pub const fn standard() -> Self {
Self {
required: true,
token_expiry_secs: 3600,
signing_key: None,
issuer: None,
audience: None,
clock_skew_secs: default_clock_skew(),
}
}
#[must_use]
pub const fn strict() -> Self {
Self {
required: true,
token_expiry_secs: 1800,
signing_key: None,
issuer: None,
audience: None,
clock_skew_secs: default_clock_skew(),
}
}
#[must_use]
pub fn with_hs256(secret: &str) -> Self {
Self {
required: true,
token_expiry_secs: 3600,
signing_key: Some(SigningKey::hs256(secret)),
issuer: None,
audience: None,
clock_skew_secs: default_clock_skew(),
}
}
#[must_use]
pub fn with_rs256_pem(pem: &str) -> Self {
Self {
required: true,
token_expiry_secs: 3600,
signing_key: Some(SigningKey::rs256_pem(pem)),
issuer: None,
audience: None,
clock_skew_secs: default_clock_skew(),
}
}
#[must_use]
pub fn with_issuer(mut self, issuer: &str) -> Self {
self.issuer = Some(issuer.to_string());
self
}
#[must_use]
pub fn with_audience(mut self, audience: &str) -> Self {
self.audience = Some(audience.to_string());
self
}
#[must_use]
pub const fn has_signing_key(&self) -> bool {
self.signing_key.is_some()
}
}