|
| 1 | +#include "jwt-cpp/traits/nlohmann-json/defaults.h" |
| 2 | + |
| 3 | +#include <iostream> |
| 4 | + |
| 5 | +int main() { |
| 6 | + std::string rsa_priv_key = R"(-----BEGIN PRIVATE KEY----- |
| 7 | +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4ZtdaIrd1BPIJ |
| 8 | +tfnF0TjIK5inQAXZ3XlCrUlJdP+XHwIRxdv1FsN12XyMYO/6ymLmo9ryoQeIrsXB |
| 9 | +XYqlET3zfAY+diwCb0HEsVvhisthwMU4gZQu6TYW2s9LnXZB5rVtcBK69hcSlA2k |
| 10 | +ZudMZWxZcj0L7KMfO2rIvaHw/qaVOE9j0T257Z8Kp2CLF9MUgX0ObhIsdumFRLaL |
| 11 | +DvDUmBPr2zuh/34j2XmWwn1yjN/WvGtdfhXW79Ki1S40HcWnygHgLV8sESFKUxxQ |
| 12 | +mKvPUTwDOIwLFL5WtE8Mz7N++kgmDcmWMCHc8kcOIu73Ta/3D4imW7VbKgHZo9+K |
| 13 | +3ESFE3RjAgMBAAECggEBAJTEIyjMqUT24G2FKiS1TiHvShBkTlQdoR5xvpZMlYbN |
| 14 | +tVWxUmrAGqCQ/TIjYnfpnzCDMLhdwT48Ab6mQJw69MfiXwc1PvwX1e9hRscGul36 |
| 15 | +ryGPKIVQEBsQG/zc4/L2tZe8ut+qeaK7XuYrPp8bk/X1e9qK5m7j+JpKosNSLgJj |
| 16 | +NIbYsBkG2Mlq671irKYj2hVZeaBQmWmZxK4fw0Istz2WfN5nUKUeJhTwpR+JLUg4 |
| 17 | +ELYYoB7EO0Cej9UBG30hbgu4RyXA+VbptJ+H042K5QJROUbtnLWuuWosZ5ATldwO |
| 18 | +u03dIXL0SH0ao5NcWBzxU4F2sBXZRGP2x/jiSLHcqoECgYEA4qD7mXQpu1b8XO8U |
| 19 | +6abpKloJCatSAHzjgdR2eRDRx5PMvloipfwqA77pnbjTUFajqWQgOXsDTCjcdQui |
| 20 | +wf5XAaWu+TeAVTytLQbSiTsBhrnoqVrr3RoyDQmdnwHT8aCMouOgcC5thP9vQ8Us |
| 21 | +rVdjvRRbnJpg3BeSNimH+u9AHgsCgYEA0EzcbOltCWPHRAY7B3Ge/AKBjBQr86Kv |
| 22 | +TdpTlxePBDVIlH+BM6oct2gaSZZoHbqPjbq5v7yf0fKVcXE4bSVgqfDJ/sZQu9Lp |
| 23 | +PTeV7wkk0OsAMKk7QukEpPno5q6tOTNnFecpUhVLLlqbfqkB2baYYwLJR3IRzboJ |
| 24 | +FQbLY93E8gkCgYB+zlC5VlQbbNqcLXJoImqItgQkkuW5PCgYdwcrSov2ve5r/Acz |
| 25 | +FNt1aRdSlx4176R3nXyibQA1Vw+ztiUFowiP9WLoM3PtPZwwe4bGHmwGNHPIfwVG |
| 26 | +m+exf9XgKKespYbLhc45tuC08DATnXoYK7O1EnUINSFJRS8cezSI5eHcbQKBgQDC |
| 27 | +PgqHXZ2aVftqCc1eAaxaIRQhRmY+CgUjumaczRFGwVFveP9I6Gdi+Kca3DE3F9Pq |
| 28 | +PKgejo0SwP5vDT+rOGHN14bmGJUMsX9i4MTmZUZ5s8s3lXh3ysfT+GAhTd6nKrIE |
| 29 | +kM3Nh6HWFhROptfc6BNusRh1kX/cspDplK5x8EpJ0QKBgQDWFg6S2je0KtbV5PYe |
| 30 | +RultUEe2C0jYMDQx+JYxbPmtcopvZQrFEur3WKVuLy5UAy7EBvwMnZwIG7OOohJb |
| 31 | +vkSpADK6VPn9lbqq7O8cTedEHttm6otmLt8ZyEl3hZMaL3hbuRj6ysjmoFKx6CrX |
| 32 | +rK0/Ikt5ybqUzKCMJZg2VKGTxg== |
| 33 | +-----END PRIVATE KEY-----)"; |
| 34 | + |
| 35 | + auto role_claim = nlohmann::json{{"my-service", {{"roles", {"foo", "bar", "baz"}}}}}; |
| 36 | + |
| 37 | + auto token = jwt::create() |
| 38 | + .set_issuer("auth0") |
| 39 | + .set_type("JWT") |
| 40 | + .set_id("rsa-create-example") |
| 41 | + .set_issued_at(std::chrono::system_clock::now()) |
| 42 | + .set_expires_at(std::chrono::system_clock::now() + std::chrono::seconds{36000}) |
| 43 | + .set_payload_claim("resource-access", role_claim) |
| 44 | + .sign(jwt::algorithm::rs256("", rsa_priv_key, "", "")); |
| 45 | + |
| 46 | + std::cout << "token: " << token << std::endl; |
| 47 | + |
| 48 | + std::string rsa_pub_key = R"(-----BEGIN PUBLIC KEY----- |
| 49 | +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4 |
| 50 | +yCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9 |
| 51 | +83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs |
| 52 | +WXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT |
| 53 | +69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8 |
| 54 | +AziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0 |
| 55 | +YwIDAQAB |
| 56 | +-----END PUBLIC KEY-----)"; |
| 57 | + |
| 58 | + auto decoded = jwt::decode(token); |
| 59 | + |
| 60 | + for (const auto& e : decoded.get_payload_claims()) |
| 61 | + std::cout << e.first << " = " << e.second << std::endl; |
| 62 | + |
| 63 | + std::cout << std::endl; |
| 64 | + |
| 65 | + auto role_verifier = [](const jwt::verify_context& ctx, std::error_code& ec) { |
| 66 | + using error = jwt::error::token_verification_error; |
| 67 | + |
| 68 | + auto c = ctx.get_claim(false, ec); |
| 69 | + if (ec) return; |
| 70 | + if (c.get_type() == jwt::json::type::object) { |
| 71 | + auto obj = c.to_json(); |
| 72 | + try { |
| 73 | + auto roles = obj["my-service"]["roles"].get<nlohmann::json::array_t>(); |
| 74 | + if (roles.end() == std::find(roles.begin(), roles.end(), "foo")) ec = error::claim_value_missmatch; |
| 75 | + } catch (const std::exception& ex) { ec = error::claim_value_missmatch; } |
| 76 | + } else |
| 77 | + ec = error::claim_type_missmatch; |
| 78 | + }; |
| 79 | + |
| 80 | + auto verifier = jwt::verify() |
| 81 | + .allow_algorithm(jwt::algorithm::rs256(rsa_pub_key, "", "", "")) |
| 82 | + .with_issuer("auth0") |
| 83 | + .with_claim("resource-access", role_verifier); |
| 84 | + |
| 85 | + try { |
| 86 | + verifier.verify(decoded); |
| 87 | + std::cout << "Success!" << std::endl; |
| 88 | + } catch (const std::exception& ex) { std::cout << "Error: " << ex.what() << std::endl; } |
| 89 | + |
| 90 | + return 0; |
| 91 | +} |
0 commit comments