почти рабочая авторизация. оказывается сейчас нет payload у запроса, поэтому невозможно распарсить из него json.
This commit is contained in:
38
src/main.cpp
38
src/main.cpp
@@ -11,12 +11,15 @@
|
||||
#include <boost/log/utility/setup/formatter_parser.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <boost/asio/ssl/context.hpp>
|
||||
#include <boost/property_tree/ptree.hpp>
|
||||
#include <boost/property_tree/json_parser.hpp>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <fstream>
|
||||
|
||||
#include "terminal_api_driver.h"
|
||||
#include "auth/resources.h"
|
||||
#include "auth/jwt.h"
|
||||
|
||||
|
||||
namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
|
||||
@@ -76,11 +79,11 @@ void init_logging() {
|
||||
class ServerResources {
|
||||
std::unique_ptr<http::resource::StaticFileFactory> sf;
|
||||
std::unique_ptr<api_driver::ApiDriver> api;
|
||||
http::auth::AuthProvider auth{};
|
||||
|
||||
public:
|
||||
static constexpr const char* INDEX_HTML = "static/main.html";
|
||||
static constexpr const char* LOGIN_HTML = "static/login.html";
|
||||
static constexpr const char* LOGIN_FAILED_HTML = "static/login-failed.html";
|
||||
|
||||
// картинки, их даже можно кешировать
|
||||
static constexpr const char* FAVICON_ICO = "static/favicon.png";
|
||||
@@ -94,9 +97,10 @@ public:
|
||||
ServerResources(const ServerResources&) = delete;
|
||||
|
||||
ServerResources(): sf(std::make_unique<http::resource::StaticFileFactory>()), api(std::make_unique<api_driver::ApiDriver>()) {
|
||||
auth.users.emplace_back(std::make_shared<http::auth::User>("admin"));
|
||||
|
||||
sf->registerFile(INDEX_HTML, mime_types::text_html, false);
|
||||
sf->registerFile(LOGIN_HTML, mime_types::text_html, false);
|
||||
sf->registerFile(LOGIN_FAILED_HTML, mime_types::text_html, false);
|
||||
|
||||
sf->registerFile(FAVICON_ICO, mime_types::image_png, true);
|
||||
sf->registerFile(KROKODIL_GIF, mime_types::image_gif, true);
|
||||
@@ -114,15 +118,36 @@ public:
|
||||
|
||||
void registerResources(http::server::Server& s) {
|
||||
s.resources.emplace_back(std::make_unique<http::resource::GenericResource>("/", [this](const auto& req, auto& rep) {
|
||||
boost::ignore_unused(req);
|
||||
sf->serve(INDEX_HTML, rep);
|
||||
auto user = auth.getSession(req);
|
||||
if (user == nullptr) {
|
||||
http::server::httpRedirect(rep, "/login");
|
||||
} else {
|
||||
sf->serve(INDEX_HTML, rep);
|
||||
}
|
||||
}));
|
||||
|
||||
s.resources.emplace_back(std::make_unique<http::resource::GenericResource>("/login", [this](const auto& req, auto& rep) {
|
||||
if (req.method == "GET") {
|
||||
sf->serve(LOGIN_HTML, rep);
|
||||
} else if (req.method == "POST") {
|
||||
sf->serve(LOGIN_FAILED_HTML, rep);
|
||||
rep.status = http::server::ok;
|
||||
rep.headers.clear();
|
||||
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||
try {
|
||||
std::istringstream is(req.body);
|
||||
boost::property_tree::ptree pt;
|
||||
boost::property_tree::read_json(is, pt);
|
||||
|
||||
auto u = auth.doAuth(req);
|
||||
if (u == nullptr) {
|
||||
throw std::runtime_error("invalid session");
|
||||
}
|
||||
std::string result = R"({"redirect":"/"})";
|
||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||
} catch (std::exception &e) {
|
||||
std::string result = R"({"error":"Неверный логин или пароль"})";
|
||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||
}
|
||||
} else {
|
||||
http::server::stockReply(http::server::bad_request, rep);
|
||||
}
|
||||
@@ -214,6 +239,9 @@ int main(int argc, char *argv[]) {
|
||||
BOOST_LOG_TRIVIAL(info) << "Starting RELEASE build" << argv[0];
|
||||
#endif
|
||||
|
||||
http::auth::jwt::generateSecretKey();
|
||||
BOOST_LOG_TRIVIAL(info) << "Generated new secret key " << http::auth::jwt::secretKey;
|
||||
|
||||
ServerResources resources;
|
||||
|
||||
// Initialise the server.
|
||||
|
||||
Reference in New Issue
Block a user