use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Hs256Config {
pub secret_env: String,
#[serde(default)]
pub issuer: Option<String>,
#[serde(default)]
pub audience: Option<String>,
}
impl Hs256Config {
pub fn load_secret(&self) -> Result<String, String> {
let value = std::env::var(&self.secret_env).map_err(|_| {
format!("auth_hs256: environment variable `{}` is not set", self.secret_env)
})?;
if value.is_empty() {
return Err(format!("auth_hs256: environment variable `{}` is empty", self.secret_env));
}
Ok(value)
}
pub fn validate(&self) -> Result<(), String> {
if self.secret_env.is_empty() {
return Err("auth_hs256: `secret_env` is required and must name the \
environment variable holding the shared secret"
.to_owned());
}
if self.audience.is_none() {
return Err("auth_hs256: `audience` is REQUIRED for security. Set it to your API \
identifier to prevent cross-service token-confusion attacks where a \
token minted by one service is accepted by another. \
Example: audience = \"my-api\" or audience = \"https://api.example.com\""
.to_owned());
}
Ok(())
}
}
#[cfg(test)]
mod tests;