use std::fmt::Debug;
use jsonwebtoken::{Algorithm, DecodingKey, EncodingKey};
use serde::{Deserialize, Serialize};
use crate::{make_decoding_key, make_encoding_key};
#[derive(Clone)]
pub struct JwtParsedKeyConfig {
pub algorithm: Algorithm,
pub expires_in: Option<u32>,
pub public_key: DecodingKey,
pub private_key: EncodingKey,
pub unparsed_public_key: String,
pub unparsed_private_key: String,
}
impl Debug for JwtParsedKeyConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("JwtParsedKeyConfig")
.field("algorithm", &self.algorithm)
.field("expires_in", &self.expires_in)
.field("public_key", &"<hidden>")
.field("private_key", &"<hidden>")
.field("unparsed_public_key", &self.unparsed_public_key)
.field("unparsed_private_key", &self.unparsed_private_key)
.finish()
}
}
impl<'de> Deserialize<'de> for JwtParsedKeyConfig {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
JwtKeyConfig::deserialize(deserializer)?
.parse_keys()
.map_err(|e| serde::de::Error::custom(e.to_string()))
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct JwtKeyConfig {
pub algorithm: Algorithm,
pub expires_in: Option<u32>,
pub public_key: String,
pub private_key: String,
}
impl JwtKeyConfig {
pub fn parse_keys(&self) -> jsonwebtoken::errors::Result<JwtParsedKeyConfig> {
Ok(JwtParsedKeyConfig {
algorithm: self.algorithm,
expires_in: self.expires_in,
public_key: self.decoding_key()?,
private_key: self.encoding_key()?,
unparsed_public_key: self.public_key.clone(),
unparsed_private_key: self.private_key.clone(),
})
}
pub fn encoding_key(&self) -> jsonwebtoken::errors::Result<EncodingKey> {
make_encoding_key(self.private_key.as_bytes(), self.algorithm)
}
pub fn decoding_key(&self) -> jsonwebtoken::errors::Result<DecodingKey> {
make_decoding_key(self.public_key.as_bytes(), self.algorithm)
}
}