tower-oauth2-resource-server 0.11.0

Tower middleware that provides JWT authorization against an OpenID Connect (OIDC) Provider
Documentation
use std::fmt::Display;

use serde::{Deserialize, Serialize};
use serde_with::{OneOrMany, formats::PreferMany, serde_as};

#[serde_as]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DefaultClaims {
    pub iss: Option<String>,
    pub sub: Option<String>,
    #[serde_as(as = "OneOrMany<_, PreferMany>")]
    #[serde(default)]
    pub aud: Vec<String>,
    pub jti: Option<String>,
}

impl Display for DefaultClaims {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{:?}", self)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn single_aud() {
        let raw_claims = "{ \"aud\": \"single\" }";
        let claims: DefaultClaims = serde_json::from_str(raw_claims).unwrap();
        assert_eq!(claims.aud.len(), 1);
        assert_eq!(claims.aud.first().unwrap(), "single");
    }

    #[test]
    fn multiple_aud() {
        let raw_claims = "{ \"aud\": [\"first\", \"second\"] }";
        let claims: DefaultClaims = serde_json::from_str(raw_claims).unwrap();
        assert_eq!(claims.aud.len(), 2);
        assert_eq!(claims.aud.first().unwrap(), "first");
        assert_eq!(claims.aud.get(1).unwrap(), "second");
    }
}