diff --git a/Cargo.lock b/Cargo.lock index e28be6c..c27ee48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -170,7 +170,7 @@ dependencies = [ "hex", "http 1.1.0", "jsonwebtoken", - "oauth2", + "openidconnect", "reqwest", "ring", "serde", @@ -197,6 +197,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.13.1" @@ -215,6 +221,12 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -245,6 +257,12 @@ version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.5.0" @@ -298,6 +316,12 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const-random" version = "0.1.18" @@ -369,6 +393,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -379,6 +415,80 @@ dependencies = [ "typenum", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -386,6 +496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -395,7 +506,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -407,6 +520,77 @@ dependencies = [ "const-random", ] +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -438,6 +622,22 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" + [[package]] name = "fnv" version = "1.0.7" @@ -524,6 +724,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -545,6 +746,17 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "h2" version = "0.3.24" @@ -557,7 +769,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -576,13 +788,19 @@ dependencies = [ "futures-sink", "futures-util", "http 1.1.0", - "indexmap", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -631,6 +849,24 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.12" @@ -814,6 +1050,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -824,6 +1066,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.2.5" @@ -832,6 +1085,7 @@ checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", ] [[package]] @@ -840,6 +1094,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -886,6 +1149,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" @@ -893,6 +1159,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1023,6 +1295,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1038,6 +1327,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -1045,6 +1345,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1092,6 +1393,38 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openidconnect" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47e80a9cfae4462dd29c41e987edd228971d6565553fbc14b8a11e666d91590" +dependencies = [ + "base64 0.13.1", + "chrono", + "dyn-clone", + "ed25519-dalek", + "hmac", + "http 0.2.12", + "itertools", + "log", + "oauth2", + "p256", + "p384", + "rand", + "rsa", + "serde", + "serde-value", + "serde_derive", + "serde_json", + "serde_path_to_error", + "serde_plain", + "serde_with", + "sha2", + "subtle", + "thiserror", + "url", +] + [[package]] name = "openssl" version = "0.10.64" @@ -1136,6 +1469,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-multimap" version = "0.6.0" @@ -1152,6 +1494,30 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1191,6 +1557,15 @@ dependencies = [ "serde", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1274,12 +1649,39 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "platforms" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" + [[package]] name = "powerfmt" version = "0.2.0" @@ -1292,6 +1694,15 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.78" @@ -1437,6 +1848,16 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.8" @@ -1447,7 +1868,7 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin", + "spin 0.9.8", "untrusted", "windows-sys 0.52.0", ] @@ -1464,6 +1885,26 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-ini" version = "0.19.0" @@ -1480,6 +1921,15 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.31" @@ -1561,6 +2011,20 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -1584,6 +2048,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + [[package]] name = "serde" version = "1.0.197" @@ -1593,6 +2063,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.197" @@ -1625,6 +2105,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + [[package]] name = "serde_spanned" version = "0.6.5" @@ -1646,6 +2135,36 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +dependencies = [ + "base64 0.21.7", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.5", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sha1" version = "0.10.6" @@ -1686,6 +2205,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "simple_asn1" version = "0.6.2" @@ -1723,12 +2252,40 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "2.0.52" @@ -1955,7 +2512,7 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", @@ -2447,3 +3004,9 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/baffao-proxy/src/main.rs b/baffao-proxy/src/main.rs index 10d6a8c..02e4943 100644 --- a/baffao-proxy/src/main.rs +++ b/baffao-proxy/src/main.rs @@ -10,7 +10,7 @@ use axum::{ routing::{any, get}, Router, }; -use baffao::oauth::OAuthHttpHandler; +use baffao::openidconnect::OAuthHttpHandler; use hyper_util::{client::legacy::connect::HttpConnector, rt::TokioExecutor}; use std::time::Duration; use tokio::signal; diff --git a/baffao-proxy/src/oauth.rs b/baffao-proxy/src/oauth.rs index 2dd0902..8d81c6c 100644 --- a/baffao-proxy/src/oauth.rs +++ b/baffao-proxy/src/oauth.rs @@ -7,7 +7,7 @@ use axum::{ use axum_extra::extract::CookieJar; use baffao::{ handlers::{oauth2_authorize, oauth2_callback, AuthorizationCallbackQuery, AuthorizationQuery}, - oauth::OAuthHttpHandler, + openidconnect::OAuthHttpHandler, }; // TODO: use signed cookies diff --git a/baffao-proxy/src/proxy.rs b/baffao-proxy/src/proxy.rs index 266fba1..5ed2f64 100644 --- a/baffao-proxy/src/proxy.rs +++ b/baffao-proxy/src/proxy.rs @@ -4,7 +4,7 @@ use axum::{ response::IntoResponse, }; use axum_extra::extract::CookieJar; -use baffao::{handlers::proxy, oauth::OAuthHttpHandler}; +use baffao::{handlers::proxy, openidconnect::OAuthHttpHandler}; use crate::settings::Settings; use crate::state::HttpClient; diff --git a/baffao-proxy/src/settings.rs b/baffao-proxy/src/settings.rs index 0cc850d..1ab1879 100644 --- a/baffao-proxy/src/settings.rs +++ b/baffao-proxy/src/settings.rs @@ -3,7 +3,7 @@ use serde::Deserialize; use std::env; use baffao::{ - oauth::OAuthConfig, + openidconnect::OAuthConfig, settings::{JwtConfig, ServerConfig}, }; diff --git a/baffao-proxy/src/state.rs b/baffao-proxy/src/state.rs index ef3d80d..9971a85 100644 --- a/baffao-proxy/src/state.rs +++ b/baffao-proxy/src/state.rs @@ -1,5 +1,5 @@ use axum::{body::Body, extract::FromRef}; -use baffao::oauth::OAuthHttpHandler; +use baffao::openidconnect::OAuthHttpHandler; use hyper_util::client::legacy::connect::HttpConnector; use crate::settings::Settings; diff --git a/baffao/Cargo.toml b/baffao/Cargo.toml index e23d5e3..e59d99c 100644 --- a/baffao/Cargo.toml +++ b/baffao/Cargo.toml @@ -21,7 +21,7 @@ cookie = "0.18.0" hex = "0.4.3" http = "1.1.0" jsonwebtoken = "9.2.0" -oauth2 = "4.4.2" +openidconnect = "3.5.0" reqwest = "0.11.24" ring = "0.17.8" serde = "1.0.197" diff --git a/baffao/src/handlers/authorize.rs b/baffao/src/handlers/authorize.rs index 2aa0c8b..aa444fc 100644 --- a/baffao/src/handlers/authorize.rs +++ b/baffao/src/handlers/authorize.rs @@ -2,7 +2,7 @@ use axum_extra::extract::CookieJar; use reqwest::StatusCode; use serde::Deserialize; -use crate::oauth::OAuthHttpHandler; +use crate::openidconnect::OAuthHttpHandler; #[derive(Deserialize)] pub struct AuthorizationQuery { diff --git a/baffao/src/handlers/callback.rs b/baffao/src/handlers/callback.rs index e68f51e..e95d3c7 100644 --- a/baffao/src/handlers/callback.rs +++ b/baffao/src/handlers/callback.rs @@ -4,7 +4,7 @@ use serde::Deserialize; use crate::{ error::build_error_redirect_url, - oauth::OAuthHttpHandler, + openidconnect::OAuthHttpHandler, settings::{CookiesConfig, ServerConfig}, }; diff --git a/baffao/src/handlers/proxy.rs b/baffao/src/handlers/proxy.rs index 87ddfa5..1f2ead3 100644 --- a/baffao/src/handlers/proxy.rs +++ b/baffao/src/handlers/proxy.rs @@ -2,7 +2,7 @@ use anyhow::{Error, Ok}; use axum_extra::extract::CookieJar; use http::HeaderMap; -use crate::oauth::OAuthHttpHandler; +use crate::openidconnect::OAuthHttpHandler; pub async fn proxy( handler: OAuthHttpHandler, diff --git a/baffao/src/lib.rs b/baffao/src/lib.rs index d565d3a..9e45d6f 100644 --- a/baffao/src/lib.rs +++ b/baffao/src/lib.rs @@ -1,5 +1,5 @@ pub mod handlers; -pub mod oauth; +pub mod openidconnect; pub mod session; pub mod cookies; diff --git a/baffao/src/oauth/client.rs b/baffao/src/openidconnect/client.rs similarity index 63% rename from baffao/src/oauth/client.rs rename to baffao/src/openidconnect/client.rs index 71f1976..6e916fd 100644 --- a/baffao/src/oauth/client.rs +++ b/baffao/src/openidconnect/client.rs @@ -1,41 +1,56 @@ -use anyhow::{Context, Error}; -use oauth2::{ - basic::BasicClient, reqwest::async_http_client, AuthType, AuthUrl, AuthorizationCode, ClientId, - ClientSecret, CsrfToken, PkceCodeChallenge, PkceCodeVerifier, RedirectUrl, RefreshToken, Scope, - TokenUrl, +use anyhow::Error; +use openidconnect::{ + core::CoreClient, reqwest::async_http_client, AuthType, AuthUrl, AuthorizationCode, ClientId, ClientSecret, CsrfToken, IssuerUrl, JsonWebKeySet, PkceCodeChallenge, PkceCodeVerifier, RedirectUrl, RefreshToken, Scope, TokenUrl, UserInfoUrl }; use reqwest::Url; use super::{AccessToken, OAuthConfig}; -pub struct OAuthClient { +pub struct OpenIDConnectClient { config: OAuthConfig, - client: BasicClient, + client: CoreClient, } -impl Clone for OAuthClient { +impl Clone for OpenIDConnectClient { fn clone(&self) -> Self { - OAuthClient { + OpenIDConnectClient { config: self.config.clone(), client: self.client.clone(), } } } -impl OAuthClient { +impl OpenIDConnectClient { pub fn new(config: OAuthConfig) -> Result { - let redirect_uri = RedirectUrl::new(config.authorization_redirect_uri.clone()) - .context("Failed to parse redirect uri")?; - let auth_url = AuthUrl::new(config.authorization_endpoint.clone()) - .context("Failed to parse authorization url")?; + let redirect_uri = RedirectUrl::new(config.authorization_redirect_uri)?; + let auth_url = AuthUrl::new(config.authorization_endpoint)?; + let issuer = IssuerUrl::new(config.issuer)?; let token_endpoint = - TokenUrl::new(config.token_endpoint.clone()).context("Failed to parse token url")?; + TokenUrl::new(config.token_endpoint)?; + let user_info_endpoint = if config.userinfo_endpoint.is_some() { + Some(UserInfoUrl::new(config.userinfo_endpoint.unwrap())?) + } else { + None + }; + if (config.jwks_uri.is_some() && config.jwks_uri.as_ref().unwrap().is_empty()) + || (config.default_scopes.is_some() && config.default_scopes.as_ref().unwrap().is_empty()) + { + return Err(Error::msg("Invalid configuration")); + } + let jwks = if config.jwks_uri.is_some() { + Some(JsonWebKeySet::fetch(config.jwks_uri.unwrap())?) + } else { + None + }; - let client = BasicClient::new( + let client = CoreClient::new( ClientId::new(config.client_id.clone()), - Some(ClientSecret::new(config.client_secret.clone())), + Some(ClientSecret::new(config.client_secret)), + issuer, auth_url, Some(token_endpoint), + user_info_endpoint, + jwks, ) .set_auth_type(AuthType::RequestBody) .set_redirect_uri(redirect_uri); @@ -43,6 +58,16 @@ impl OAuthClient { Ok(Self { config, client }) } + pub fn from_provider_metadata(&self) -> Result { + CoreClient::from_provider_metadata( + provider_metadata, + ClientId::new(config.client_id.clone()), + Some(ClientSecret::new(config.client_secret)), + ); + + Ok(Self { config, client }) + } + pub fn build_authorization_endpoint( &self, scope: Option>, diff --git a/baffao/src/oauth/http.rs b/baffao/src/openidconnect/http.rs similarity index 89% rename from baffao/src/oauth/http.rs rename to baffao/src/openidconnect/http.rs index 94ae490..2e43153 100644 --- a/baffao/src/oauth/http.rs +++ b/baffao/src/openidconnect/http.rs @@ -1,20 +1,19 @@ use anyhow::{Error, Ok}; use axum_extra::extract::CookieJar; use chrono::{Duration, Utc}; -use oauth2::TokenResponse; use super::OAuthConfig; use crate::cookies::new_cookie; use crate::session::{update_session, Session}; -use crate::{oauth::OAuthClient, settings::CookiesConfig}; +use crate::{openidconnect::OAuthClient, settings::CookiesConfig}; #[derive(Clone)] -pub struct OAuthHttpHandler { +pub struct OpenIDConnectHttpHandler { client: OAuthClient, cookies_config: CookiesConfig, } -impl OAuthHttpHandler { +impl OpenIDConnectHttpHandler { pub fn new(oauth_config: OAuthConfig, cookies_config: CookiesConfig) -> Result { let client = OAuthClient::new(oauth_config)?; @@ -108,6 +107,15 @@ impl OAuthHttpHandler { updated_jar = updated_jar.remove(self.cookies_config.refresh_token.to_owned().name); } + if token_result.id_token().is_some() { + updated_jar = updated_jar.add(new_cookie( + self.cookies_config.id_token.to_owned(), + token_result.id_token().unwrap().secret().to_string(), + )); + } else { + updated_jar = updated_jar.remove(self.cookies_config.id_token.to_owned().name); + } + let now = Utc::now(); let expires_in = token_result.expires_in().map(|duration| { now.checked_add_signed(Duration::from_std(duration).unwrap()) diff --git a/baffao/src/oauth/mod.rs b/baffao/src/openidconnect/mod.rs similarity index 78% rename from baffao/src/oauth/mod.rs rename to baffao/src/openidconnect/mod.rs index d2ce4d9..bd8cd4b 100644 --- a/baffao/src/oauth/mod.rs +++ b/baffao/src/openidconnect/mod.rs @@ -4,7 +4,7 @@ pub use http::OAuthHttpHandler; mod client; mod http; -use oauth2::{basic::BasicTokenType, EmptyExtraTokenFields, StandardTokenResponse}; +use openidconnect::{basic::BasicTokenType, EmptyExtraTokenFields, StandardTokenResponse}; use serde::Deserialize; @@ -19,10 +19,13 @@ use serde::Deserialize; pub struct OAuthConfig { pub client_id: String, pub client_secret: String, + pub issuer: String, pub authorization_redirect_uri: String, pub authorization_endpoint: String, pub token_endpoint: String, + pub userinfo_endpoint: Option, pub redirect_uri: Option, + pub jwks_uri: Option, pub default_scopes: Option>, }