From 0c52413f99819ac048ea72414148d289c3f43ab0 Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Wed, 26 Jan 2022 14:23:47 +0100 Subject: Add OpenID auth to auth mgr. --- zenserver/auth/authmgr.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) (limited to 'zenserver/auth/authmgr.cpp') diff --git a/zenserver/auth/authmgr.cpp b/zenserver/auth/authmgr.cpp index af579d950..4c97693f9 100644 --- a/zenserver/auth/authmgr.cpp +++ b/zenserver/auth/authmgr.cpp @@ -14,10 +14,7 @@ namespace zen { class AuthMgrImpl final : public AuthMgr { public: - AuthMgrImpl(const AuthConfig& Config) : m_Log(logging::Get("auth")) - { - ZEN_UNUSED(Config); - } + AuthMgrImpl(const AuthConfig& Config) : m_Log(logging::Get("auth")) { ZEN_UNUSED(Config); } virtual ~AuthMgrImpl() {} @@ -46,6 +43,45 @@ public: ZEN_INFO("added OpenID provider '{} - {}'", Params.Name, Params.Url); } + virtual bool AddOpenIdToken(const AddOpenIdTokenParams& Params) final + { + if (Params.ProviderName.empty()) + { + ZEN_WARN("trying add OpenID token with invalid provider name"); + return false; + } + + if (Params.IdentityToken.empty() || Params.RefreshToken.empty() || Params.AccessToken.empty()) + { + ZEN_WARN("trying add invalid OpenID token"); + return false; + } + + bool IsNew = false; + + { + std::unique_lock _(m_TokenMutex); + + const auto InsertResult = m_OpenIdTokens.try_emplace(std::string(Params.ProviderName), + OpenIdToken{.IdentityToken = std::string(Params.IdentityToken), + .RefreshToken = Params.RefreshToken, + .AccessToken = Params.AccessToken}); + + IsNew = InsertResult.second; + } + + if (IsNew) + { + ZEN_INFO("added new OpenID token for provider '{}'", Params.ProviderName); + } + else + { + ZEN_INFO("updating OpenID token for provider '{}'", Params.ProviderName); + } + + return true; + } + private: struct OpenIdProvider { @@ -54,13 +90,24 @@ private: std::string ClientId; }; + struct OpenIdToken + { + std::string_view IdentityToken; + std::string_view RefreshToken; + std::string_view AccessToken; + double ExpireTime{}; + }; + using OpenIdProviderMap = std::unordered_map>; + using OpenIdTokenMap = std::unordered_map; spdlog::logger& Log() { return m_Log; } spdlog::logger& m_Log; - std::mutex m_ProviderMutex; OpenIdProviderMap m_OpenIdProviders; + OpenIdTokenMap m_OpenIdTokens; + std::mutex m_ProviderMutex; + std::shared_mutex m_TokenMutex; }; std::unique_ptr -- cgit v1.2.3