diff options
Diffstat (limited to 'zenserver/auth/authservice.cpp')
| -rw-r--r-- | zenserver/auth/authservice.cpp | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/zenserver/auth/authservice.cpp b/zenserver/auth/authservice.cpp index eecad45bf..4e6f496a6 100644 --- a/zenserver/auth/authservice.cpp +++ b/zenserver/auth/authservice.cpp @@ -1,19 +1,70 @@ // Copyright Epic Games, Inc. All Rights Reserved. +#include <auth/authmgr.h> #include <auth/authservice.h> + +#include <zencore/compactbinarybuilder.h> #include <zencore/string.h> +ZEN_THIRD_PARTY_INCLUDES_START +#include <json11.hpp> +ZEN_THIRD_PARTY_INCLUDES_END + namespace zen { using namespace std::literals; -HttpAuthService::HttpAuthService() +HttpAuthService::HttpAuthService(AuthMgr& AuthMgr) : m_AuthMgr(AuthMgr) { m_Router.RegisterRoute( "token", - [](HttpRouterRequest& RouterRequest) { + [this](HttpRouterRequest& RouterRequest) { HttpServerRequest& ServerRequest = RouterRequest.ServerRequest(); - ServerRequest.WriteResponse(HttpResponseCode::OK); + + const HttpContentType ContentType = ServerRequest.RequestContentType(); + + if ((ContentType == HttpContentType::kUnknownContentType || ContentType == HttpContentType::kJSON) == false) + { + return ServerRequest.WriteResponse(HttpResponseCode::BadRequest); + } + + const IoBuffer Body = ServerRequest.ReadPayload(); + + std::string JsonText(reinterpret_cast<const char*>(Body.GetData()), Body.GetSize()); + std::string JsonError; + json11::Json TokenInfo = json11::Json::parse(JsonText, JsonError); + + if (!JsonError.empty()) + { + CbObjectWriter Response; + Response << "Result"sv << false; + Response << "Error"sv << JsonError; + + return ServerRequest.WriteResponse(HttpResponseCode::BadRequest, Response.Save()); + } + + const std::string IdentityToken = TokenInfo["IdentityToken"].string_value(); + const std::string RefreshToken = TokenInfo["RefreshToken"].string_value(); + const std::string AccessToken = TokenInfo["AccessToken"].string_value(); + + const bool Ok = m_AuthMgr.AddOpenIdToken(AuthMgr::AddOpenIdTokenParams{.ProviderName = "Okta"sv, + .IdentityToken = IdentityToken, + .RefreshToken = RefreshToken, + .AccessToken = AccessToken}); + + if (Ok) + { + ServerRequest.WriteResponse(Ok ? HttpResponseCode::OK : HttpResponseCode::BadRequest); + } + else + { + CbObjectWriter Response; + Response << "Result"sv << false; + Response << "Error"sv + << "Invalid token"sv; + + ServerRequest.WriteResponse(HttpResponseCode::BadRequest, Response.Save()); + } }, HttpVerb::kPost); } |