feat: Integrate CIE authentication flow
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
#include "common/Crypto.h"
|
||||
|
||||
#include <drogon/utils/Utilities.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/hmac.h>
|
||||
|
||||
#include <iomanip>
|
||||
#include <random>
|
||||
#include <sstream>
|
||||
@@ -27,6 +30,29 @@ std::string sha256(const std::string &value)
|
||||
return drogon::utils::getSha256(value);
|
||||
}
|
||||
|
||||
std::string hmacSha256Hex(const std::string &key, const std::string &value)
|
||||
{
|
||||
unsigned char digest[EVP_MAX_MD_SIZE];
|
||||
unsigned int digestSize = 0;
|
||||
HMAC(EVP_sha256(),
|
||||
key.data(),
|
||||
static_cast<int>(key.size()),
|
||||
reinterpret_cast<const unsigned char *>(value.data()),
|
||||
value.size(),
|
||||
digest,
|
||||
&digestSize);
|
||||
return toHex(digest, digestSize);
|
||||
}
|
||||
|
||||
bool constantTimeEquals(const std::string &left, const std::string &right)
|
||||
{
|
||||
if (left.size() != right.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return CRYPTO_memcmp(left.data(), right.data(), left.size()) == 0;
|
||||
}
|
||||
|
||||
std::string randomNumericCode(int digits)
|
||||
{
|
||||
std::random_device device;
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
namespace visione::crypto
|
||||
{
|
||||
std::string sha256(const std::string &value);
|
||||
std::string hmacSha256Hex(const std::string &key, const std::string &value);
|
||||
bool constantTimeEquals(const std::string &left, const std::string &right);
|
||||
std::string randomNumericCode(int digits);
|
||||
std::string randomToken();
|
||||
std::string hashSecret(const std::string &secret);
|
||||
|
||||
+31
-1
@@ -1,5 +1,9 @@
|
||||
#include "common/Http.h"
|
||||
|
||||
#include <drogon/HttpRequest.h>
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace visione::http
|
||||
{
|
||||
drogon::HttpResponsePtr json(Json::Value body, drogon::HttpStatusCode status)
|
||||
@@ -22,6 +26,14 @@ drogon::HttpResponsePtr error(const std::string &code,
|
||||
return json(std::move(body), status);
|
||||
}
|
||||
|
||||
drogon::HttpResponsePtr redirect(const std::string &url,
|
||||
drogon::HttpStatusCode status)
|
||||
{
|
||||
auto response = drogon::HttpResponse::newRedirectionResponse(url);
|
||||
response->setStatusCode(status);
|
||||
return response;
|
||||
}
|
||||
|
||||
Json::Value requireJson(const drogon::HttpRequestPtr &request)
|
||||
{
|
||||
const auto &body = request->getJsonObject();
|
||||
@@ -31,5 +43,23 @@ Json::Value requireJson(const drogon::HttpRequestPtr &request)
|
||||
}
|
||||
return *body;
|
||||
}
|
||||
} // namespace visione::http
|
||||
|
||||
Json::Value parseJsonBody(const std::string &body)
|
||||
{
|
||||
if (body.empty())
|
||||
{
|
||||
return Json::Value(Json::nullValue);
|
||||
}
|
||||
|
||||
Json::CharReaderBuilder builder;
|
||||
builder["collectComments"] = false;
|
||||
std::string errors;
|
||||
Json::Value parsed;
|
||||
std::istringstream stream(body);
|
||||
if (!Json::parseFromStream(builder, stream, &parsed, &errors))
|
||||
{
|
||||
return Json::Value(Json::nullValue);
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
} // namespace visione::http
|
||||
|
||||
+3
-1
@@ -12,6 +12,8 @@ drogon::HttpResponsePtr json(Json::Value body,
|
||||
drogon::HttpResponsePtr error(const std::string &code,
|
||||
drogon::HttpStatusCode status,
|
||||
const std::string &message = {});
|
||||
drogon::HttpResponsePtr redirect(const std::string &url,
|
||||
drogon::HttpStatusCode status = drogon::k302Found);
|
||||
Json::Value requireJson(const drogon::HttpRequestPtr &request);
|
||||
Json::Value parseJsonBody(const std::string &body);
|
||||
} // namespace visione::http
|
||||
|
||||
|
||||
Reference in New Issue
Block a user