use serde::{Deserialize, Serialize};
use crate::principal::PrincipalId;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ClientAssertion {
pub iss: PrincipalId,
pub sub: PrincipalId,
pub aud: String,
pub jti: String,
pub iat: i64,
pub exp: i64,
}
impl ClientAssertion {
pub const MAX_LIFETIME_SECONDS: i64 = 300;
pub fn new(
principal: PrincipalId,
aud: impl Into<String>,
jti: impl Into<String>,
iat: i64,
exp: i64,
) -> Self {
Self {
iss: principal.clone(),
sub: principal,
aud: aud.into(),
jti: jti.into(),
iat,
exp,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips_with_wire_principal_ids() {
let a = ClientAssertion::new(PrincipalId::service("yubaba"), "https://c.example/token", "j1", 10, 70);
let v = serde_json::to_value(&a).unwrap();
assert_eq!(v["iss"], "svc:yubaba");
assert_eq!(v["sub"], "svc:yubaba");
let back: ClientAssertion = serde_json::from_value(v).unwrap();
assert_eq!(back, a);
}
}