Use fixed copy of JWT library until upstream merges

This commit is contained in:
Grant Limberg 2022-06-27 10:44:33 -07:00
parent 3cb24410a8
commit 1300cf23c5
No known key found for this signature in database
GPG Key ID: 8F2F97D3BE8D7735
7 changed files with 148 additions and 326 deletions

3
zeroidc/Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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"}
{"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}

View File

@ -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

283
zeroidc/vendor/jwt/Cargo.lock generated vendored
View File

@ -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"

View File

@ -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 <mikkyangg@gmail.com>"]
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"

View File

@ -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<String>,
#[serde(rename = "aud", skip_serializing_if = "Option::is_none")]
pub audience: Option<String>,
pub audience: Option<StringOrVec>,
#[serde(rename = "exp", skip_serializing_if = "Option::is_none")]
pub expiration: Option<SecondsSinceEpoch>,
@ -51,6 +53,76 @@ pub struct RegisteredClaims {
pub json_web_token_id: Option<String>,
}
/// 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<String>,
multi: Option<Vec<String>>,
}
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<E>(self, value: &str) -> Result<StringOrVec, E>
where
E: Error,
{
Ok(StringOrVec {
one: Some(value.to_string()),
multi: None,
})
}
fn visit_seq<S>(self, seq: S) -> Result<StringOrVec, S::Error>
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<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_any(StringOrVecVisitor)
}
}
impl Serialize for StringOrVec {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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(())
}
}