You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
4.6 KiB
103 lines
4.6 KiB
#ifndef AIRMAP_AUTHENTICATOR_H_ |
|
#define AIRMAP_AUTHENTICATOR_H_ |
|
|
|
#include <airmap/credentials.h> |
|
#include <airmap/do_not_copy_or_move.h> |
|
#include <airmap/error.h> |
|
#include <airmap/outcome.h> |
|
#include <airmap/token.h> |
|
|
|
#include <chrono> |
|
#include <functional> |
|
#include <stdexcept> |
|
#include <string> |
|
|
|
namespace airmap { |
|
|
|
/// Authenticator provides functionality to authenticate with the AirMap services. |
|
class Authenticator : DoNotCopyOrMove { |
|
public: |
|
/// Scope enumerates all known authentication scopes. |
|
enum class Scope { access_token = 0, open_id = 1, open_id_offline_access = 2 }; |
|
/// GrantType enumerates all known grant types. |
|
enum class GrantType { |
|
password = 0, ///< The grant is constituted by a password |
|
bearer = 1 ///< The grant is constituted by a bearer |
|
}; |
|
/// Connection enumerates all known types of connection to users. |
|
enum class Connection { |
|
username_password_authentication = 0 ///< authentication requires username/password |
|
}; |
|
|
|
/// AuthenticateWithPassword groups together types to ease interaction with |
|
/// Authenticator::authenticate_with_password. |
|
struct AuthenticateWithPassword { |
|
/// Parameters bundles up input parameters. |
|
struct Params { |
|
Credentials::OAuth oauth; ///< OAuth-specific credentials for this authentication request. |
|
GrantType grant_type{GrantType::password}; ///< The grant type of this authentication request. |
|
Scope scope{Scope::open_id_offline_access}; ///< The scope of this authentication request. |
|
Connection connection{ |
|
Connection::username_password_authentication}; ///< The connection type of the authentication request. |
|
}; |
|
|
|
/// Result models the outcome of calling Authenticator::authenticate_with_password. |
|
using Result = Outcome<Token::OAuth, Error>; |
|
/// Callback describes the function signature of the callback that is |
|
/// invoked when a call to Authenticator::authenticate_with_password finishes. |
|
using Callback = std::function<void(const Result&)>; |
|
}; |
|
|
|
/// AuthenticateAnonymously groups together types to ease interaction with |
|
/// Authenticator::authenticate_anonymously. |
|
struct AuthenticateAnonymously { |
|
/// The input parameters. |
|
using Params = Credentials::Anonymous; |
|
/// Result models the outcome of calling Authenticator::authenticate_anonymously. |
|
using Result = Outcome<Token::Anonymous, Error>; |
|
/// Callback describes the function signature of the callback that is |
|
/// invoked when a call to Authenticator::authenticate_anonymously finishes. |
|
using Callback = std::function<void(const Result&)>; |
|
}; |
|
|
|
/// RenewAuthentication groups together types to ease interaction with |
|
/// Authenticator::renew_authentication. |
|
struct RenewAuthentication { |
|
/// The input parameters. |
|
struct Params { |
|
std::string client_id; ///< The app id for which authentication renewal is requested. |
|
std::string refresh_token; ///< The refresh token for the authentication renewal request. |
|
GrantType grant_type{GrantType::bearer}; ///< The grant type of the authentication renewal request. |
|
Scope scope{Scope::open_id}; ///< The scope of the authentication renewal request. |
|
}; |
|
/// Result models the outcome of calling Authenticator::renew_authentication. |
|
using Result = Outcome<Token::Refreshed, Error>; |
|
/// Callback describes the function signature of the callback that is |
|
/// invoked when a call to Authenticator::renew_authentication finishes. |
|
using Callback = std::function<void(const Result&)>; |
|
}; |
|
|
|
/// authenticate_with_password authenticates the user described in 'params' with |
|
/// the AirMap services and reports the result to 'cb'. |
|
virtual void authenticate_with_password(const AuthenticateWithPassword::Params& params, |
|
const AuthenticateWithPassword::Callback& cb) = 0; |
|
|
|
/// authenticate_anonymously authenticates an anonymous user described by Params::user_id |
|
/// with the AirMap services and reports the result to 'cb'. |
|
virtual void authenticate_anonymously(const AuthenticateAnonymously::Params&, |
|
const AuthenticateAnonymously::Callback&) = 0; |
|
|
|
/// renew_authentication renews a pre-authenticated JWT as given in Params::user_id with |
|
/// the AirMap services and reports the result to 'cb'. |
|
virtual void renew_authentication(const RenewAuthentication::Params& params, |
|
const RenewAuthentication::Callback& cb) = 0; |
|
|
|
protected: |
|
/// @cond |
|
Authenticator() = default; |
|
/// @endcond |
|
}; |
|
|
|
} // namespace airmap |
|
|
|
#endif // AIRMAP_AUTHENTICATOR_H_
|
|
|