From 2c0104ec2d2ebc87f985aa9bdd7ca10dc492dfdd Mon Sep 17 00:00:00 2001 From: eraden Date: Mon, 18 Apr 2022 22:07:52 +0200 Subject: [PATCH] Token validation --- .env | 2 + Cargo.lock | 320 +++++++++++++++++- api/Cargo.toml | 7 + api/assets/index.html | 13 + api/src/actors/cart_manager.rs | 78 ++++- api/src/actors/database.rs | 29 +- api/src/actors/database/account_orders.rs | 8 +- api/src/actors/database/accounts.rs | 8 +- api/src/actors/database/order_items.rs | 8 +- api/src/actors/database/products.rs | 2 +- .../actors/database/shopping_cart_items.rs | 41 ++- api/src/actors/database/shopping_carts.rs | 42 ++- api/src/actors/database/stocks.rs | 2 +- api/src/actors/database/tokens.rs | 73 ++++ api/src/actors/mod.rs | 1 + api/src/actors/token_manager.rs | 267 +++++++++++++++ api/src/logic/mod.rs | 8 +- api/src/main.rs | 32 +- api/src/model.rs | 102 +++++- api/src/routes/admin/api_v1.rs | 6 +- api/src/routes/admin/api_v1/products.rs | 24 +- api/src/routes/admin/api_v1/stocks.rs | 26 +- api/src/routes/admin/mod.rs | 32 +- api/src/routes/mod.rs | 41 ++- api/src/routes/public.rs | 23 +- api/src/routes/public/api_v1.rs | 80 ++++- api/src/utils.rs | 26 +- db/migrate/202204181325_create_tokens.sql | 27 ++ .../20220418215_add_uniq_add_time_format.sql | 4 + rustfmt.toml | 9 +- 30 files changed, 1204 insertions(+), 137 deletions(-) create mode 100644 api/src/actors/database/tokens.rs create mode 100644 api/src/actors/token_manager.rs create mode 100644 db/migrate/202204181325_create_tokens.sql create mode 100644 db/migrate/20220418215_add_uniq_add_time_format.sql diff --git a/.env b/.env index 2d28a08..8b21e48 100644 --- a/.env +++ b/.env @@ -2,3 +2,5 @@ DATABASE_URL=postgres://postgres@localhost/bazzar PASS_SALT=18CHwV7eGFAea16z+qMKZg RUST_LOG=debug KEY_SECRET="NEPJs#8jjn8SK8GC7QEC^*P844UgsyEbQB8mRWXkT%3mPrwewZoc25MMby9H#R*w2KzaQgMkk#Pif$kxrLy*N5L!Ch%jxbWoa%gb" +JWT_SECRET="42^iFq&ZnQbUf!hwGWXd&CpyY6QQyJmkPU%esFCvne5&Ejcb3nJ4&GyHZp!MArZLf^9*5c6!!VgM$iZ8T%d#&bWTi&xbZk2S@4RN" +PGDATESTYLE= diff --git a/Cargo.lock b/Cargo.lock index 9b572cd..d139885 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -693,6 +693,21 @@ dependencies = [ "syn", ] +[[package]] +name = "actix-web-httpauth" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c25a48b4684f90520183cd1a688e5f4f7e9905835fa75d02c0fe4f60fcdbe6" +dependencies = [ + "actix-service 2.0.2", + "actix-utils 3.0.0", + "actix-web 4.0.1", + "base64 0.13.0", + "futures-core", + "futures-util", + "pin-project-lite 0.2.8", +] + [[package]] name = "actix-web-opentelemetry" version = "0.12.0" @@ -958,6 +973,7 @@ dependencies = [ "actix-rt 2.7.0", "actix-session", "actix-web 4.0.1", + "actix-web-httpauth", "actix-web-opentelemetry", "argon2", "chrono", @@ -966,13 +982,17 @@ dependencies = [ "futures", "futures-util", "gumdrop", + "hmac", + "jwt", "log", + "oauth2", "parking_lot 0.12.0", "password-hash", "pretty_env_logger", "rand_core 0.6.3", "serde", "serde_json", + "sha2 0.10.2", "sqlx", "sqlx-core", "tera", @@ -1028,6 +1048,15 @@ dependencies = [ "generic-array 0.12.4", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.5", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -1225,7 +1254,7 @@ dependencies = [ "hmac", "percent-encoding", "rand 0.8.5", - "sha2", + "sha2 0.10.2", "subtle", "time 0.3.9", "version_check", @@ -1372,6 +1401,15 @@ dependencies = [ "generic-array 0.12.4", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", +] + [[package]] name = "digest" version = "0.10.3" @@ -1691,8 +1729,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.10.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1889,6 +1929,17 @@ dependencies = [ "itoa 1.0.1", ] +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes 1.1.0", + "http", + "pin-project-lite 0.2.8", +] + [[package]] name = "http-range" version = "0.1.5" @@ -1922,6 +1973,43 @@ dependencies = [ "quick-error", ] +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes 1.1.0", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.13", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.1", + "pin-project-lite 0.2.8", + "socket2 0.4.4", + "tokio 1.17.0", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" +dependencies = [ + "http", + "hyper", + "rustls 0.20.4", + "tokio 1.17.0", + "tokio-rustls 0.23.3", +] + [[package]] name = "idna" version = "0.2.3" @@ -1988,9 +2076,15 @@ dependencies = [ "socket2 0.3.19", "widestring", "winapi 0.3.9", - "winreg", + "winreg 0.6.2", ] +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + [[package]] name = "ipnetwork" version = "0.17.0" @@ -2036,6 +2130,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jwt" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f" +dependencies = [ + "base64 0.13.0", + "crypto-common", + "digest 0.10.3", + "hmac", + "serde", + "serde_json", + "sha2 0.10.2", +] + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -2396,6 +2505,26 @@ dependencies = [ "libc", ] +[[package]] +name = "oauth2" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e47cfc4c0a1a519d9a025ebfbac3a2439d1b5cdf397d72dcb79b11d9920dab" +dependencies = [ + "base64 0.13.0", + "chrono", + "getrandom 0.2.6", + "http", + "rand 0.8.5", + "reqwest", + "serde", + "serde_json", + "serde_path_to_error", + "sha2 0.9.9", + "thiserror", + "url", +] + [[package]] name = "object" version = "0.27.1" @@ -2884,6 +3013,44 @@ version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +[[package]] +name = "reqwest" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +dependencies = [ + "base64 0.13.0", + "bytes 1.1.0", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.13", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "percent-encoding", + "pin-project-lite 0.2.8", + "rustls 0.20.4", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded 0.7.1", + "tokio 1.17.0", + "tokio-rustls 0.23.3", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.22.3", + "winreg 0.10.1", +] + [[package]] name = "resolv-conf" version = "0.6.3" @@ -2953,8 +3120,29 @@ dependencies = [ "base64 0.13.0", "log", "ring", - "sct", - "webpki", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-pemfile" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" +dependencies = [ + "base64 0.13.0", ] [[package]] @@ -2988,6 +3176,16 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "semver" version = "0.9.0" @@ -3040,6 +3238,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7868ad3b8196a8a0aea99a8220b124278ee5320a55e4fde97794b6f85b1a377" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.6.1" @@ -3102,6 +3309,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + [[package]] name = "sha2" version = "0.10.2" @@ -3241,11 +3461,11 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "rust_decimal", - "rustls", + "rustls 0.19.1", "serde", "serde_json", "sha-1 0.10.0", - "sha2", + "sha2 0.10.2", "smallvec", "sqlformat", "sqlx-rt", @@ -3255,8 +3475,8 @@ dependencies = [ "tokio-stream", "url", "uuid", - "webpki", - "webpki-roots", + "webpki 0.21.4", + "webpki-roots 0.21.1", "whoami", ] @@ -3273,7 +3493,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "sha2", + "sha2 0.10.2", "sqlx-core", "sqlx-rt", "syn", @@ -3289,7 +3509,7 @@ dependencies = [ "actix-rt 2.7.0", "once_cell", "tokio 1.17.0", - "tokio-rustls", + "tokio-rustls 0.22.0", ] [[package]] @@ -3597,9 +3817,20 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "rustls", + "rustls 0.19.1", "tokio 1.17.0", - "webpki", + "webpki 0.21.4", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e" +dependencies = [ + "rustls 0.20.4", + "tokio 1.17.0", + "webpki 0.22.0", ] [[package]] @@ -3678,6 +3909,12 @@ dependencies = [ "serde", ] +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + [[package]] name = "tracing" version = "0.1.34" @@ -3760,6 +3997,12 @@ dependencies = [ "trust-dns-proto", ] +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "twoway" version = "0.2.2" @@ -3915,6 +4158,7 @@ dependencies = [ "idna", "matches", "percent-encoding", + "serde", ] [[package]] @@ -3975,6 +4219,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -4018,6 +4272,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.80" @@ -4067,13 +4333,32 @@ dependencies = [ "untrusted", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki-roots" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" dependencies = [ - "webpki", + "webpki 0.21.4", +] + +[[package]] +name = "webpki-roots" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" +dependencies = [ + "webpki 0.22.0", ] [[package]] @@ -4187,6 +4472,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" diff --git a/api/Cargo.toml b/api/Cargo.toml index 3b9af40..211dd7b 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" actix = { version = "0.13.0" } actix-rt = { version = "2.7.0" } actix-web = { version = "4.0.1" } +actix-web-httpauth = { version = "0.6.0" } actix-auth = { version = "0.1.0" } actix-cors = { version = "0.6.1" } actix-files = { version = "0.6.0" } @@ -52,3 +53,9 @@ rand_core = { version = "0.6", features = ["std"] } tokio = { version = "1.17.0", features = ["full"] } futures = { version = "0.3.21" } futures-util = { version = "0.3.21" } + +jwt = { version = "0.16.0", features = [] } +hmac = { version = "0.12.1" } +sha2 = { version = "0.10.2" } + +oauth2 = { version = "4.1.0" } diff --git a/api/assets/index.html b/api/assets/index.html index 34ba01e..efe161b 100644 --- a/api/assets/index.html +++ b/api/assets/index.html @@ -34,6 +34,10 @@
+
+ + +