Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
 
Loading...
Searching...
No Matches
auth.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <random>
4#include <string>
5#include <expected>
6#include <format>
7#include <regex>
8#include <optional>
9
10#include "native.h"
11#include <asio.hpp>
12#include <asio/experimental/awaitable_operators.hpp>
13using namespace asio::experimental::awaitable_operators;
14
15#include <absl/container/flat_hash_map.h>
16#include <spdlog/spdlog.h>
17#include <secp256k1.h>
18#include <secp256k1_recovery.h>
19#include <jwt-cpp/jwt.h>
20
21// Undefine the conflicting macro
22#ifdef interface
23 #undef interface
24#endif
25#include <evmc/evmc.hpp>
26#ifndef interface
27 #define interface __STRUCT__
28#endif
29
30#include "utils.hpp"
31#include "keccak256.hpp"
32
33namespace dcn::parse
34{
35 std::string parseNonceFromMessage(const std::string & msg);
36
37 std::optional<std::string> parseAccessTokenFromCookieHeader(const std::string & cookie_str);
38 std::string parseAccessTokenToCookieHeader(const std::string & token_str);
39
40 std::optional<std::string> parseRefreshTokenFromCookieHeader(const std::string & cookie_str);
41 std::string parseRefreshTokenToCookieHeader(const std::string & token_str);
42}
43
44namespace dcn
45{
46 enum class AuthenticationError : std::uint8_t
47 {
48 Unknown = 0,
56 };
57
59 {
60 public:
61 AuthManager() = delete;
62 AuthManager(asio::io_context & io_context);
63
64 AuthManager(const AuthManager&) = delete;
66
67 ~AuthManager() = default;
68
69 asio::awaitable<std::string> generateNonce(const evmc::address & address);
70
71 asio::awaitable<bool> verifyNonce(const evmc::address & address, const std::string & nonce);
72
73 asio::awaitable<bool> verifySignature(const evmc::address & address, const std::string& signature, const std::string& message);
74
75 asio::awaitable<std::string> generateAccessToken(const evmc::address & address);
76
77 asio::awaitable<std::expected<evmc::address, AuthenticationError>> verifyAccessToken(std::string token) const;
78
79 asio::awaitable<bool> compareAccessToken(const evmc::address & address, std::string token) const;
80
81 asio::awaitable<std::string> generateRefreshToken(const evmc::address & address);
82
83 asio::awaitable<std::expected<evmc::address, AuthenticationError>> verifyRefreshToken(std::string token) const;
84
85 private:
86 asio::strand<asio::io_context::executor_type> _strand;
87
88 const std::string _SECRET; // !!! TODO !!! use secure secret in production
89
90 std::mt19937 _rng;
91 std::uniform_int_distribution<int> _dist;
92 absl::flat_hash_map<evmc::address, std::string> _nonces;
93
94 absl::flat_hash_map<evmc::address, std::string> _refresh_tokens;
95 absl::flat_hash_map<evmc::address, std::string> _access_tokens;
96 };
97}
98
99template <>
100struct std::formatter<dcn::AuthenticationError> : std::formatter<std::string> {
101 auto format(const dcn::AuthenticationError & err, format_context& ctx) const {
102 switch(err)
103 {
104 case dcn::AuthenticationError::MissingCookie : return formatter<string>::format("MissingCookie", ctx);
105 case dcn::AuthenticationError::InvalidCookie : return formatter<string>::format("InvalidCookie", ctx);
106 case dcn::AuthenticationError::MissingToken : return formatter<string>::format("MissingToken", ctx);
107 case dcn::AuthenticationError::InvalidToken : return formatter<string>::format("InvalidToken", ctx);
108 case dcn::AuthenticationError::InvalidSignature : return formatter<string>::format("InvalidSignature", ctx);
109 case dcn::AuthenticationError::InvalidNonce : return formatter<string>::format("InvalidNonce", ctx);
110 case dcn::AuthenticationError::InvalidAddress : return formatter<string>::format("InvalidAddress", ctx);
111
112 default: return formatter<string>::format("Unknown", ctx);
113 }
114 return formatter<string>::format("", ctx);
115 }
116};
Definition auth.hpp:59
asio::awaitable< std::string > generateNonce(const evmc::address &address)
Definition auth.cpp:88
asio::awaitable< bool > verifyNonce(const evmc::address &address, const std::string &nonce)
Definition auth.cpp:98
AuthManager()=delete
asio::awaitable< std::string > generateAccessToken(const evmc::address &address)
Definition auth.cpp:159
asio::awaitable< bool > verifySignature(const evmc::address &address, const std::string &signature, const std::string &message)
Definition auth.cpp:117
asio::awaitable< bool > compareAccessToken(const evmc::address &address, std::string token) const
Definition auth.cpp:219
~AuthManager()=default
AuthManager & operator=(const AuthManager &)=delete
asio::awaitable< std::expected< evmc::address, AuthenticationError > > verifyAccessToken(std::string token) const
Definition auth.cpp:176
asio::awaitable< std::string > generateRefreshToken(const evmc::address &address)
Definition auth.cpp:236
AuthManager(const AuthManager &)=delete
asio::awaitable< std::expected< evmc::address, AuthenticationError > > verifyRefreshToken(std::string token) const
Definition auth.cpp:253
Definition auth.hpp:34
std::string parseAccessTokenToCookieHeader(const std::string &token_str)
Definition auth.cpp:49
std::string parseRefreshTokenToCookieHeader(const std::string &token_str)
Definition auth.cpp:71
std::string parseNonceFromMessage(const std::string &msg)
Definition auth.cpp:17
std::optional< std::string > parseRefreshTokenFromCookieHeader(const std::string &cookie_str)
Definition auth.cpp:56
std::optional< std::string > parseAccessTokenFromCookieHeader(const std::string &cookie_str)
Definition auth.cpp:34
Definition decentralised_art.hpp:30
AuthenticationError
Definition auth.hpp:47
auto format(const dcn::AuthenticationError &err, format_context &ctx) const
Definition auth.hpp:101