use base64::Engine;
use serde::Deserialize;
use crate::common::error::JwtError;
#[derive(Debug, Clone, Deserialize)]
pub struct TokenPayload {
pub iss: String,
#[serde(rename = "token_use")]
pub token_use: Option<String>,
#[serde(rename = "client_id")]
pub client_id: Option<String>,
pub exp: Option<u64>,
}
pub struct CognitoTokenParser;
impl CognitoTokenParser {
pub fn parse_token_payload(token: &str) -> Result<TokenPayload, JwtError> {
if token.is_empty() {
return Err(JwtError::MissingToken);
}
let parts: Vec<&str> = token.split('.').collect();
if parts.len() != 3 {
return Err(JwtError::ParseError {
part: Some("token".to_string()),
error: "Invalid token format: expected 3 parts separated by dots".to_string(),
});
}
let payload = base64::engine::general_purpose::URL_SAFE_NO_PAD
.decode(parts[1])
.map_err(|e| JwtError::ParseError {
part: Some("payload".to_string()),
error: format!("Invalid base64 in payload: {}", e),
})?;
let payload: TokenPayload = serde_json::from_slice(&payload)
.map_err(|e| JwtError::ParseError {
part: Some("payload".to_string()),
error: format!("Invalid JSON in payload: {}", e),
})?;
Ok(payload)
}
}