tower_oauth2_resource_server/
claims.rs

1use std::fmt::Display;
2
3use serde::{Deserialize, Serialize};
4use serde_with::{OneOrMany, formats::PreferMany, serde_as};
5
6#[serde_as]
7#[derive(Clone, Debug, Deserialize, Serialize)]
8pub struct DefaultClaims {
9    pub iss: Option<String>,
10    pub sub: Option<String>,
11    #[serde_as(as = "OneOrMany<_, PreferMany>")]
12    #[serde(default)]
13    pub aud: Vec<String>,
14    pub jti: Option<String>,
15}
16
17impl Display for DefaultClaims {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        write!(f, "{:?}", self)
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn single_aud() {
29        let raw_claims = "{ \"aud\": \"single\" }";
30        let claims: DefaultClaims = serde_json::from_str(raw_claims).unwrap();
31        assert_eq!(claims.aud.len(), 1);
32        assert_eq!(claims.aud.first().unwrap(), "single");
33    }
34
35    #[test]
36    fn multiple_aud() {
37        let raw_claims = "{ \"aud\": [\"first\", \"second\"] }";
38        let claims: DefaultClaims = serde_json::from_str(raw_claims).unwrap();
39        assert_eq!(claims.aud.len(), 2);
40        assert_eq!(claims.aud.first().unwrap(), "first");
41        assert_eq!(claims.aud.get(1).unwrap(), "second");
42    }
43}