From 1300cf23c58bfa5c21c3b6fd587177dfb41e2d48 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 27 Jun 2022 10:44:33 -0700 Subject: [PATCH] Use fixed copy of JWT library until upstream merges --- zeroidc/Cargo.lock | 3 +- zeroidc/Cargo.toml | 2 +- zeroidc/vendor/jwt/.cargo-checksum.json | 2 +- zeroidc/vendor/jwt/.github/workflows/rust.yml | 22 ++ zeroidc/vendor/jwt/Cargo.lock | 283 ------------------ zeroidc/vendor/jwt/Cargo.toml | 51 +--- zeroidc/vendor/jwt/src/claims.rs | 111 ++++++- 7 files changed, 148 insertions(+), 326 deletions(-) create mode 100644 zeroidc/vendor/jwt/.github/workflows/rust.yml delete mode 100644 zeroidc/vendor/jwt/Cargo.lock diff --git a/zeroidc/Cargo.lock b/zeroidc/Cargo.lock index 0633da9d5..45dff3e97 100644 --- a/zeroidc/Cargo.lock +++ b/zeroidc/Cargo.lock @@ -478,8 +478,7 @@ dependencies = [ [[package]] name = "jwt" version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f" +source = "git+https://github.com/glimberg/rust-jwt#61a9291fdeec747c6edf14f4fa0caf235136c168" dependencies = [ "base64", "crypto-common", diff --git a/zeroidc/Cargo.toml b/zeroidc/Cargo.toml index 7633d2afb..653be4cff 100644 --- a/zeroidc/Cargo.toml +++ b/zeroidc/Cargo.toml @@ -13,7 +13,7 @@ openidconnect = { version = "2.2", default-features = false, features = ["reqwes base64 = "0.13" url = "2.2" reqwest = "0.11" -jwt = "0.16" +jwt = {version = "0.16", git = "https://github.com/glimberg/rust-jwt"} serde = "1.0" time = { version = "0.3", features = ["formatting"] } bytes = "1.1" diff --git a/zeroidc/vendor/jwt/.cargo-checksum.json b/zeroidc/vendor/jwt/.cargo-checksum.json index 1d06253dc..0f17c9db9 100644 --- a/zeroidc/vendor/jwt/.cargo-checksum.json +++ b/zeroidc/vendor/jwt/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"a2f539608f97d8f98e5b296c19d06515481949b1f031517dcf1c62cb38c70ea2","Cargo.toml":"a0f66e02db1107ce5f882d63cd0b48241f39f31988a8b59d61f9c2f15e0c7634","LICENSE":"6863634a792d36121f9e9c5ad6093c26520c97fb3e6396b354545c3f58969d4e","README.md":"f7b0fc2ad58d744d4dad9d149fe4ba89f2ae48091ebbaf691237405040e16dbd","examples/custom_claims.rs":"54afdafdd6eb9d014ffa574386dda173cd5bb064aae66d41411fd18df9a26265","examples/hs256.rs":"62a847c9d455f0d0d5c9ad95be06707ae40496c94a669e37d33adaf01f5fcf0c","src/algorithm/mod.rs":"83d779fabf3e5c8b1dd507d51c7b1abc0e6724eae4bf2b9341b9f1321d361108","src/algorithm/openssl.rs":"45d5252a5a02d9a6e6198e682d59bcdd7624f2d6dc9d16ede5f9774e17deb74d","src/algorithm/rust_crypto.rs":"e518c754d19d3f4cb62fe5c78d3fa673699d8501cf0225cecb49fe4ead68138c","src/algorithm/store.rs":"da6af6dafb6f223020dece153d69d985a9061480e6170b6bb155a2d59bbdf73e","src/claims.rs":"2ab2ac2341a33068e6fb0d5ee57db315caf85cef2eff7fabc91a095a9e5411da","src/error.rs":"ff3f5eda3390d0e53d5241961808fce7fa154d319d7f0bfde6a279ce87865a1f","src/header.rs":"bc542f3355da24d49443b6a82f843a0af78c6bfe236a8ed1c0e0659a4b44eeef","src/lib.rs":"fb17cbadb6c1fc2d4897edc289521ced9c07e6055c373177727067ce7ba384cd","src/token/mod.rs":"afaf57a53d317b026ab0ff9bccede79962a7ac26f06840bbda6b4a5b56e1185e","src/token/signed.rs":"48cba5ae1fae99ba369dfc0414c0d3a8f9c7ad489f0c1875959e6b8dc962c8e4","src/token/verified.rs":"88258dec2a31b5edf1e76d6d985ca5324e1b04ed31033966ea3f203937d69723","test/es256-private.pem":"e78044d6a7e87ebfd6e929e435ffe260bd728a1397b9d7906c8316b08a2bcd91","test/es256-public.pem":"4aa69dafd976d669e58e08734621e84d5248611b61dcdea8c2301f13a897d632","test/rs256-private.pem":"9f0b1cde761836bade73e1dcacc7f59abf361a5a9077c2495549dd78d93827fd","test/rs256-public-2.pem":"1c350b92548ade1a0696678257f95b0f5e96ae006fa794d9781627e92283bb4b","test/rs256-public.pem":"2d2f53a127944dc169e102ef0bf077808211fa26cb750d1272235cdac78aa8c4"},"package":"6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f"} \ No newline at end of file +{"files":{".github/workflows/rust.yml":"f394411995c12d93808e11341fde58c291f108a881d02402d5bca4d69aefac9d","Cargo.toml":"b699e7776ebbb660db912772734135a4f05a0ad02e09e69b04d08c85301f5c7e","LICENSE":"6863634a792d36121f9e9c5ad6093c26520c97fb3e6396b354545c3f58969d4e","README.md":"f7b0fc2ad58d744d4dad9d149fe4ba89f2ae48091ebbaf691237405040e16dbd","examples/custom_claims.rs":"54afdafdd6eb9d014ffa574386dda173cd5bb064aae66d41411fd18df9a26265","examples/hs256.rs":"62a847c9d455f0d0d5c9ad95be06707ae40496c94a669e37d33adaf01f5fcf0c","src/algorithm/mod.rs":"83d779fabf3e5c8b1dd507d51c7b1abc0e6724eae4bf2b9341b9f1321d361108","src/algorithm/openssl.rs":"45d5252a5a02d9a6e6198e682d59bcdd7624f2d6dc9d16ede5f9774e17deb74d","src/algorithm/rust_crypto.rs":"e518c754d19d3f4cb62fe5c78d3fa673699d8501cf0225cecb49fe4ead68138c","src/algorithm/store.rs":"da6af6dafb6f223020dece153d69d985a9061480e6170b6bb155a2d59bbdf73e","src/claims.rs":"c944cc7631faa9e4943dc127b252149631a15eb9c84e005d55ac0e8600c08ab5","src/error.rs":"ff3f5eda3390d0e53d5241961808fce7fa154d319d7f0bfde6a279ce87865a1f","src/header.rs":"bc542f3355da24d49443b6a82f843a0af78c6bfe236a8ed1c0e0659a4b44eeef","src/lib.rs":"fb17cbadb6c1fc2d4897edc289521ced9c07e6055c373177727067ce7ba384cd","src/token/mod.rs":"afaf57a53d317b026ab0ff9bccede79962a7ac26f06840bbda6b4a5b56e1185e","src/token/signed.rs":"48cba5ae1fae99ba369dfc0414c0d3a8f9c7ad489f0c1875959e6b8dc962c8e4","src/token/verified.rs":"88258dec2a31b5edf1e76d6d985ca5324e1b04ed31033966ea3f203937d69723","test/es256-private.pem":"e78044d6a7e87ebfd6e929e435ffe260bd728a1397b9d7906c8316b08a2bcd91","test/es256-public.pem":"4aa69dafd976d669e58e08734621e84d5248611b61dcdea8c2301f13a897d632","test/rs256-private.pem":"9f0b1cde761836bade73e1dcacc7f59abf361a5a9077c2495549dd78d93827fd","test/rs256-public-2.pem":"1c350b92548ade1a0696678257f95b0f5e96ae006fa794d9781627e92283bb4b","test/rs256-public.pem":"2d2f53a127944dc169e102ef0bf077808211fa26cb750d1272235cdac78aa8c4"},"package":null} \ No newline at end of file diff --git a/zeroidc/vendor/jwt/.github/workflows/rust.yml b/zeroidc/vendor/jwt/.github/workflows/rust.yml new file mode 100644 index 000000000..3c13d1be2 --- /dev/null +++ b/zeroidc/vendor/jwt/.github/workflows/rust.yml @@ -0,0 +1,22 @@ +name: Rust + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/zeroidc/vendor/jwt/Cargo.lock b/zeroidc/vendor/jwt/Cargo.lock deleted file mode 100644 index 2e94d1dd0..000000000 --- a/zeroidc/vendor/jwt/Cargo.lock +++ /dev/null @@ -1,283 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cc" -version = "1.0.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cpufeatures" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b" -dependencies = [ - "block-buffer", - "crypto-common", - "generic-array", - "subtle", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "hmac" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddca131f3e7f2ce2df364b57949a9d47915cfbd35e46cfee355ccebbf794d6a2" -dependencies = [ - "digest", -] - -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "jwt" -version = "0.16.0" -dependencies = [ - "base64", - "crypto-common", - "digest", - "doc-comment", - "hmac", - "openssl", - "serde", - "serde_json", - "sha2", -] - -[[package]] -name = "libc" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "openssl" -version = "0.10.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-sys", -] - -[[package]] -name = "openssl-sys" -version = "0.9.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" -dependencies = [ - "autocfg", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "proc-macro2" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "serde" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99c3bd8169c58782adad9290a9af5939994036b76187f7b4f0e6de91dbbfc0ec" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "1.0.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" diff --git a/zeroidc/vendor/jwt/Cargo.toml b/zeroidc/vendor/jwt/Cargo.toml index dfccdcdc5..4865ea2f5 100644 --- a/zeroidc/vendor/jwt/Cargo.toml +++ b/zeroidc/vendor/jwt/Cargo.toml @@ -1,54 +1,31 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - [package] -edition = "2018" name = "jwt" version = "0.16.0" authors = ["Michael Yang "] description = "JSON Web Token library" -homepage = "http://github.com/mikkyang/rust-jwt" documentation = "https://docs.rs/jwt" +homepage = "http://github.com/mikkyang/rust-jwt" +repository = "http://github.com/mikkyang/rust-jwt" readme = "README.md" keywords = ["JWT", "token", "web"] license = "MIT" -repository = "http://github.com/mikkyang/rust-jwt" +edition = "2018" + [package.metadata.docs.rs] features = ["openssl"] -[dependencies.base64] -version = "0.13" -[dependencies.crypto-common] -version = "0.1" - -[dependencies.digest] -version = "0.10" - -[dependencies.hmac] -version = "0.12" -features = ["reset"] +[dependencies] +base64 = "0.13" +crypto-common = "0.1" +digest = "0.10" +hmac = { version = "0.12", features = ["reset"] } +sha2 = "0.10" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" [dependencies.openssl] version = "0.10" optional = true -[dependencies.serde] -version = "1.0" -features = ["derive"] - -[dependencies.serde_json] -version = "1.0" - -[dependencies.sha2] -version = "0.10" -[dev-dependencies.doc-comment] -version = "0.3" +[dev-dependencies] +doc-comment = "0.3" diff --git a/zeroidc/vendor/jwt/src/claims.rs b/zeroidc/vendor/jwt/src/claims.rs index a21fbc901..d77b4829f 100644 --- a/zeroidc/vendor/jwt/src/claims.rs +++ b/zeroidc/vendor/jwt/src/claims.rs @@ -2,7 +2,9 @@ use std::collections::BTreeMap; -use serde::{Deserialize, Serialize}; +use serde::de::{value, Error, SeqAccess, Visitor}; +use serde::ser::SerializeSeq; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; /// Generic [JWT claims](https://tools.ietf.org/html/rfc7519#page-8) with /// defined fields for registered and private claims. @@ -36,7 +38,7 @@ pub struct RegisteredClaims { pub subject: Option, #[serde(rename = "aud", skip_serializing_if = "Option::is_none")] - pub audience: Option, + pub audience: Option, #[serde(rename = "exp", skip_serializing_if = "Option::is_none")] pub expiration: Option, @@ -51,6 +53,76 @@ pub struct RegisteredClaims { pub json_web_token_id: Option, } +/// Struct to handle the `aud` field because the JWT spec says that +/// it can be either a string or an array of strings. +/// [Audience Claim Specificatgion](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3). +#[derive(Clone, Debug, Default, PartialEq)] +pub struct StringOrVec { + one: Option, + multi: Option>, +} + +struct StringOrVecVisitor; + +impl<'de> Visitor<'de> for StringOrVecVisitor { + type Value = StringOrVec; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a string or an array of strings") + } + + fn visit_str(self, value: &str) -> Result + where + E: Error, + { + Ok(StringOrVec { + one: Some(value.to_string()), + multi: None, + }) + } + + fn visit_seq(self, seq: S) -> Result + where + S: SeqAccess<'de>, + { + match Deserialize::deserialize(value::SeqAccessDeserializer::new(seq)) { + Ok(r) => Ok(StringOrVec { + one: None, + multi: Some(r), + }), + Err(e) => Err(e), + } + } +} + +impl<'de> Deserialize<'de> for StringOrVec { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_any(StringOrVecVisitor) + } +} + +impl Serialize for StringOrVec { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + if let Some(o) = &self.one { + serializer.serialize_str(&o) + } else if let Some(multi) = &self.multi { + let mut seq = serializer.serialize_seq(Some(multi.len()))?; + for e in multi { + seq.serialize_element(&e)?; + } + seq.end() + } else { + serializer.serialize_none() + } + } +} + #[cfg(test)] mod tests { use crate::claims::Claims; @@ -89,4 +161,39 @@ mod tests { assert_eq!(claims, Claims::from_base64(&*enc)?); Ok(()) } + + #[test] + fn aud_single() -> Result<(), Error> { + // {"iss": "mikkyang.com", "exp": 1302319100, "custom_claim": true, "aud": "test", "alg": "HS256" } + let payload = "eyJpc3MiOiJtaWtreWFuZy5jb20iLCJleHAiOjEzMDIzMTkxMDAsImN1c3RvbV9jbGFpbSI6dHJ1ZSwiYXVkIjoidGVzdCIsImFsZyI6IkhTMjU2In0"; + + let claims = Claims::from_base64(payload)?; + + assert_ne!(claims.registered.audience, None); + + let aud = &claims.registered.audience.unwrap(); + + assert_eq!(aud.one, Some("test".to_string())); + assert_eq!(aud.multi, None); + + Ok(()) + } + + #[test] + fn aud_multi() -> Result<(), Error> { + // {"iss": "mikkyang.com", "exp": 1302319100, "custom_claim": true, "aud": ["test1", "test2"], "alg": "HS256" } + let payload = "eyJpc3MiOiJtaWtreWFuZy5jb20iLCJleHAiOjEzMDIzMTkxMDAsImN1c3RvbV9jbGFpbSI6dHJ1ZSwiYXVkIjpbInRlc3QxIiwidGVzdDIiXSwiYWxnIjoiSFMyNTYifQ"; + + let claims = Claims::from_base64(payload)?; + + assert_ne!(claims.registered.audience, None); + + let aud = &claims.registered.audience.unwrap(); + + assert_eq!(aud.one, None); + assert_eq!(aud.multi.as_ref().unwrap().len(), 2); + assert_eq!(aud.multi.as_ref().unwrap()[0], "test1".to_string()); + assert_eq!(aud.multi.as_ref().unwrap()[1], "test2".to_string()); + Ok(()) + } }