60 std::string_view& auth_header_value, std::string& error_reason)
62 auto next_space = auth_header_value.find(
' ');
63 if (next_space == std::string::npos)
65 error_reason =
"Authorization header only contains one field";
68 auto auth_scheme = auth_header_value.substr(0, next_space);
69 if (auth_scheme != ccf::http::auth::BEARER_AUTH_SCHEME)
71 error_reason = fmt::format(
72 "Authorization header does not have {} scheme",
73 ccf::http::auth::BEARER_AUTH_SCHEME);
76 auth_header_value = auth_header_value.substr(next_space + 1);
102 std::string_view& token, std::string& error_reason)
104 constexpr char separator =
'.';
105 size_t first_dot = token.find(separator);
106 size_t second_dot = std::string::npos;
107 if (first_dot != std::string::npos)
109 second_dot = token.find(separator, first_dot + 1);
111 size_t extra_dot = std::string::npos;
112 if (second_dot != std::string::npos)
114 extra_dot = token.find(separator, second_dot + 1);
117 first_dot == std::string::npos || second_dot == std::string::npos ||
118 extra_dot != std::string::npos)
120 error_reason =
"Malformed JWT: must contain exactly 3 parts";
123 size_t header_size = first_dot;
124 size_t payload_size = second_dot - first_dot - 1;
125 std::string_view header_b64url = token.substr(0, header_size);
126 std::string_view payload_b64url =
127 token.substr(first_dot + 1, payload_size);
128 std::string_view signature_b64url = token.substr(second_dot + 1);
131 if (header_raw.empty())
138 if (payload_raw.empty())
145 if (signature_raw.empty())
150 auto signed_content = token.substr(0, second_dot);
151 nlohmann::json header;
152 nlohmann::json payload;
155 header = nlohmann::json::parse(header_raw);
156 payload = nlohmann::json::parse(payload_raw);
158 catch (
const nlohmann::json::parse_error& e)
161 fmt::format(
"JWT header or payload is not valid JSON: {}", e.what());
164 if (!header.is_object() || !payload.is_object())
166 error_reason =
"JWT header or payload is not an object";
177 fmt::format(
"JWT header does not follow schema: {}", e.describe());
187 error_reason = fmt::format(
188 "JWT payload is missing required field: {}", e.describe());
204 const auto auth_it = headers.find(ccf::http::headers::AUTHORIZATION);
205 if (auth_it == headers.end())
208 fmt::format(
"Missing {} header", ccf::http::headers::AUTHORIZATION);
211 std::string_view token = auth_it->second;