MySQL 9.3.0
Source Code Documentation
oauth2_handler.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2021, 2025, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef ROUTER_SRC_REST_MRS_SRC_MRS_AUTHENTICATION_OAUTH2_HANDLER_H_
27#define ROUTER_SRC_REST_MRS_SRC_MRS_AUTHENTICATION_OAUTH2_HANDLER_H_
28
29#include <chrono>
30#include <functional>
31#include <optional>
32#include <string>
33#include <vector>
34
35#include "helper/http/url.h"
37#include "http/base/method.h"
38#include "http/base/request.h"
43
44namespace mrs {
45namespace authentication {
46
48 protected:
50 using duration = std::chrono::steady_clock::duration;
52 using steady_clock = std::chrono::steady_clock;
53 using time_point = std::chrono::steady_clock::time_point;
62
63 public:
65 public:
66 virtual ~RequestHandler() = default;
67
68 virtual void before_send(Request *request) = 0;
69 virtual bool response(const std::vector<uint8_t> &value) = 0;
70 };
71 using RequestHandlerPtr = std::unique_ptr<RequestHandler>;
72
74 public:
75 std::string access_token;
76 std::string refresh_token;
77 std::string auth_code;
78 std::string redirection;
79 std::string redirection_host;
81 bool session_id_set{false};
83 std::string challange;
84 };
85
86 public:
88 : entry_{entry},
89 um_{entry_.limit_to_registered_users, entry_.default_role_id, qf} {}
90
91 const AuthApp &get_entry() const override;
92 std::set<UniversalId> get_service_ids() const override;
93 UniversalId get_id() const override;
94
95 bool redirects(RequestContext &ctxt) const override;
96 bool authorize(RequestContext &ctxt, const SessionPtr &session,
97 AuthUser *out_user) override;
98 std::optional<std::string> get_session_id_from_request_data(
99 RequestContext &ctxt) override;
100
102 public:
103 using OutPair = std::pair<const char *, VariantPointer>;
104 using OutJsonObjectKeyValues = std::vector<OutPair>;
105
107 : output_{std::move(output)} {}
108
109 void before_send(Request *request) override;
110 bool response(const std::vector<uint8_t> &value) override;
111
113 };
114
115 UserManager &get_user_manager() override { return um_; }
116
117 protected:
118 virtual std::string get_url_direct_auth() const = 0;
119 virtual std::string get_url_location(GenericSessionData *data,
120 Url *url) const = 0;
121 virtual std::string get_url_validation(GenericSessionData *data) const = 0;
123 GenericSessionData *session_data) = 0;
125 Session *session, GenericSessionData *session_data) = 0;
126 virtual std::string get_body_access_token_request(
127 GenericSessionData *session_data) const = 0;
128
129 protected:
130 std::string get_cookie_session_id(Request *request) const;
132 SessionManager::Session *session);
133
134 void new_session_start_login(RequestContext &ctxt, Session *session);
137 SqlSessionCached *sql_session);
138
139 protected:
140 static bool send_http_request(HttpMethodType method, const std::string &url,
141 const std::string &body,
142 RequestHandler *request_handler = nullptr);
143
146};
147
148} // namespace authentication
149} // namespace mrs
150
151#endif // ROUTER_SRC_REST_MRS_SRC_MRS_AUTHENTICATION_OAUTH2_HANDLER_H_
Definition: cache_manager.h:41
Definition: variant_pointer.h:34
Definition: url.h:44
Definition: request.h:44
Definition: uri.h:40
seconds expires
Definition: oauth2_handler.h:80
time_point acquired_at
Definition: oauth2_handler.h:82
std::string challange
Definition: oauth2_handler.h:83
bool session_id_set
Definition: oauth2_handler.h:81
std::string auth_code
Definition: oauth2_handler.h:77
std::string redirection_host
Definition: oauth2_handler.h:79
std::string refresh_token
Definition: oauth2_handler.h:76
std::string redirection
Definition: oauth2_handler.h:78
std::string access_token
Definition: oauth2_handler.h:75
std::vector< OutPair > OutJsonObjectKeyValues
Definition: oauth2_handler.h:104
void before_send(Request *request) override
Definition: oauth2_handler.cc:65
RequestHandlerJsonSimpleObject(OutJsonObjectKeyValues output)
Definition: oauth2_handler.h:106
std::pair< const char *, VariantPointer > OutPair
Definition: oauth2_handler.h:103
OutJsonObjectKeyValues output_
Definition: oauth2_handler.h:112
bool response(const std::vector< uint8_t > &value) override
Definition: oauth2_handler.cc:67
virtual void before_send(Request *request)=0
virtual bool response(const std::vector< uint8_t > &value)=0
Definition: oauth2_handler.h:47
std::optional< std::string > get_session_id_from_request_data(RequestContext &ctxt) override
Definition: oauth2_handler.cc:305
UserManager & get_user_manager() override
Definition: oauth2_handler.h:115
::http::base::method::key_type HttpMethodType
Definition: oauth2_handler.h:54
static bool send_http_request(HttpMethodType method, const std::string &url, const std::string &body, RequestHandler *request_handler=nullptr)
Definition: oauth2_handler.cc:94
std::set< UniversalId > get_service_ids() const override
Definition: oauth2_handler.cc:86
std::chrono::seconds seconds
Definition: oauth2_handler.h:51
bool redirects(RequestContext &ctxt) const override
Definition: oauth2_handler.cc:60
UserManager um_
Definition: oauth2_handler.h:145
virtual std::string get_url_direct_auth() const =0
virtual std::string get_url_location(GenericSessionData *data, Url *url) const =0
std::unique_ptr< RequestHandler > RequestHandlerPtr
Definition: oauth2_handler.h:71
virtual std::string get_body_access_token_request(GenericSessionData *session_data) const =0
virtual std::string get_url_validation(GenericSessionData *data) const =0
bool http_acquire_access_token(GenericSessionData *data)
Definition: oauth2_handler.cc:161
std::chrono::steady_clock::time_point time_point
Definition: oauth2_handler.h:53
void new_session_start_login(RequestContext &ctxt, Session *session)
Definition: oauth2_handler.cc:188
bool authorize(RequestContext &ctxt, const SessionPtr &session, AuthUser *out_user) override
Definition: oauth2_handler.cc:224
UniversalId get_id() const override
Definition: oauth2_handler.cc:92
const AuthApp & get_entry() const override
Definition: oauth2_handler.cc:90
AuthApp entry_
Definition: oauth2_handler.h:144
Oauth2Handler(const AuthApp &entry, QueryFactory *qf)
Definition: oauth2_handler.h:87
std::chrono::steady_clock::duration duration
Definition: oauth2_handler.h:50
virtual RequestHandlerPtr get_request_handler_access_token(GenericSessionData *session_data)=0
std::chrono::steady_clock steady_clock
Definition: oauth2_handler.h:52
bool http_verify_account(Session *session, GenericSessionData *data, SqlSessionCached *sql_session)
Definition: oauth2_handler.cc:310
virtual RequestHandlerPtr get_request_handler_verify_account(Session *session, GenericSessionData *session_data)=0
std::string get_cookie_session_id(Request *request) const
void set_cookie_session_id(Request *request, SessionManager::Session *session)
Definition: session_manager.h:66
Definition: session_manager.h:64
Definition: session_manager.h:48
Definition: authorize_handler.h:53
mrs::database::entry::AuthApp AuthApp
Definition: authorize_handler.h:57
rest::RequestContext RequestContext
Definition: authorize_handler.h:58
Definition: query_factory.h:55
Definition: user_manager.h:41
int key_type
Definition: method.h:38
Request::Uri Uri
Definition: request.cc:36
mrs::database::entry::AuthApp AuthApp
Definition: oauth2_handler.cc:58
helper::http::Url Url
Definition: sasl_handler.cc:75
std::chrono::seconds seconds
Definition: authorize_manager.cc:69
mrs::database::entry::AuthUser AuthUser
Definition: scram_handler.cc:54
AuthorizeManager::SessionPtr SessionPtr
Definition: authorize_manager.cc:79
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
Definition: authorize_manager.h:48
mrs::database::entry::UniversalId UniversalId
Definition: universal_id.h:33
Definition: gcs_xcom_synode.h:64
RestClient::Request Request
Definition: rest_client.cc:29
Definition: completion_hash.h:35
Definition: request_context.h:47