feat(CIE): Implement OIDC RP Service with login, callback, and session management

This commit is contained in:
gabdevele
2026-06-16 23:33:59 +02:00 Unverified
parent bb7ed18539
commit 5f81d2dcf7
31 changed files with 3218 additions and 4 deletions
+88
View File
@@ -0,0 +1,88 @@
#include "common/OidcHttp.h"
#include <drogon/HttpClient.h>
#include <stdexcept>
namespace visione::oidc
{
namespace
{
HttpResponseData sendGet(const std::string &url,
const std::map<std::string, std::string> &headers,
double timeoutSeconds)
{
auto client = drogon::HttpClient::newHttpClient(url);
auto request = drogon::HttpRequest::newHttpRequest();
request->setMethod(drogon::Get);
for (const auto &[key, value] : headers)
{
request->addHeader(key, value);
}
const auto [result, response] = client->sendRequest(request, timeoutSeconds);
if (result != drogon::ReqResult::Ok || !response)
{
throw std::runtime_error("http_get_failed");
}
HttpResponseData out;
out.statusCode = static_cast<int>(response->statusCode());
out.body = response->body();
return out;
}
} // namespace
HttpResponseData httpGet(const std::string &url, double timeoutSeconds)
{
return sendGet(url, {}, timeoutSeconds);
}
HttpResponseData httpGet(const std::string &url,
const std::map<std::string, std::string> &headers,
double timeoutSeconds)
{
return sendGet(url, headers, timeoutSeconds);
}
HttpResponseData httpPostForm(const std::string &url,
const std::map<std::string, std::string> &params,
double timeoutSeconds)
{
auto client = drogon::HttpClient::newHttpClient(url);
auto request = drogon::HttpRequest::newHttpFormPostRequest();
request->setMethod(drogon::Post);
for (const auto &[key, value] : params)
{
request->setBodyParameter(key, value);
}
const auto [result, response] = client->sendRequest(request, timeoutSeconds);
if (result != drogon::ReqResult::Ok || !response)
{
throw std::runtime_error("http_post_failed");
}
HttpResponseData out;
out.statusCode = static_cast<int>(response->statusCode());
out.body = response->body();
return out;
}
Json::Value parseJsonResponse(const HttpResponseData &response)
{
Json::CharReaderBuilder builder;
builder["collectComments"] = false;
std::string errors;
Json::Value value;
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(response.body.data(),
response.body.data() + response.body.size(),
&value,
&errors))
{
throw std::runtime_error("invalid_http_json");
}
return value;
}
} // namespace visione::oidc