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
9#include "native.h"
10#include <asio.hpp>
11#include <asio/experimental/awaitable_operators.hpp>
12using namespace asio::experimental::awaitable_operators;
13
14#include <absl/container/flat_hash_map.h>
15#include <spdlog/spdlog.h>
16#include <secp256k1.h>
17#include <secp256k1_recovery.h>
18#include <jwt-cpp/jwt.h>
19
20#include "utils.hpp"
21#include "keccak256.hpp"
22#include "http.hpp"
23#include "parse_error.hpp"
24#include "evm.hpp"
25
26namespace dcn::auth
27{
28 struct AuthError
29 {
30 enum class Kind : std::uint8_t
31 {
32 UNKNOWN = 0,
33
36
38
40
42 }
44
45 std::string message = "";
46 };
47
49 {
50 public:
51 AuthManager() = delete;
52 AuthManager(asio::io_context & io_context);
53
54 AuthManager(const AuthManager&) = delete;
56
57 ~AuthManager() = default;
58
59 asio::awaitable<std::string> generateNonce(const evm::Address & address);
60
61 asio::awaitable<bool> verifyNonce(const evm::Address & address, const std::string & nonce);
62
63 asio::awaitable<bool> verifySignature(const evm::Address & address, const std::string& signature, const std::string& message);
64
65 asio::awaitable<std::string> generateAccessToken(const evm::Address & address);
66
67 asio::awaitable<std::expected<evm::Address, AuthError>> verifyAccessToken(std::string token) const;
68
69 asio::awaitable<bool> compareAccessToken(const evm::Address & address, std::string token) const;
70
71 asio::awaitable<void> invalidateAccessToken(const evm::Address & address);
72
73 private:
74 asio::strand<asio::io_context::executor_type> _strand;
75
76 const std::string _SECRET; // !!! TODO !!! use secure secret in production
77
78 static std::random_device _rng;
79
80 std::uniform_int_distribution<int> _dist;
81 absl::flat_hash_map<evm::Address, std::string> _nonces;
82
83 absl::flat_hash_map<evm::Address, std::string> _access_tokens;
84 };
85}
86
87template <>
88struct std::formatter<dcn::auth::AuthError::Kind> : std::formatter<std::string> {
89 auto format(const dcn::auth::AuthError::Kind & err, format_context& ctx) const {
90 switch(err)
91 {
92 case dcn::auth::AuthError::Kind::MISSING_TOKEN : return formatter<string>::format("Missing token", ctx);
93 case dcn::auth::AuthError::Kind::INVALID_TOKEN : return formatter<string>::format("Invalid token", ctx);
94 case dcn::auth::AuthError::Kind::INVALID_SIGNATURE : return formatter<string>::format("Invalid signature", ctx);
95 case dcn::auth::AuthError::Kind::INVALID_NONCE : return formatter<string>::format("Invalid nonce", ctx);
96 case dcn::auth::AuthError::Kind::INVALID_ADDRESS : return formatter<string>::format("Invalid address", ctx);
97
98 default: return formatter<string>::format("Unknown", ctx);
99 }
100 return formatter<string>::format("", ctx);
101 }
102};
Definition auth.hpp:49
asio::awaitable< bool > compareAccessToken(const evm::Address &address, std::string token) const
Definition auth.cpp:199
AuthManager(const AuthManager &)=delete
asio::awaitable< void > invalidateAccessToken(const evm::Address &address)
Definition auth.cpp:216
asio::awaitable< bool > verifyNonce(const evm::Address &address, const std::string &nonce)
Definition auth.cpp:41
asio::awaitable< std::expected< evm::Address, AuthError > > verifyAccessToken(std::string token) const
Definition auth.cpp:119
asio::awaitable< std::string > generateNonce(const evm::Address &address)
Definition auth.cpp:31
asio::awaitable< bool > verifySignature(const evm::Address &address, const std::string &signature, const std::string &message)
Definition auth.cpp:60
asio::awaitable< std::string > generateAccessToken(const evm::Address &address)
Definition auth.cpp:102
AuthManager & operator=(const AuthManager &)=delete
Definition auth.hpp:27
evmc::address Address
Definition evm.hpp:44
Definition decentralised_art.hpp:29
Definition auth.hpp:29
std::string message
Definition auth.hpp:45
Kind
Definition auth.hpp:31
enum dcn::auth::AuthError::Kind kind
auto format(const dcn::auth::AuthError::Kind &err, format_context &ctx) const
Definition auth.hpp:89