feat(CIE): Implement OIDC RP Service with login, callback, and session management
This commit is contained in:
@@ -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> ¶ms,
|
||||
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
|
||||
Reference in New Issue
Block a user