// Copyright Epic Games, Inc. All Rights Reserved. #include #include ZEN_THIRD_PARTY_INCLUDES_START #include #include #include ZEN_THIRD_PARTY_INCLUDES_END namespace zen { namespace httpclientauth { using namespace std::literals; std::function CreateFromStaticToken(HttpClientAccessToken Token) { return [Token]() { return Token; }; } std::function CreateFromStaticToken(std::string_view Token) { return CreateFromStaticToken( HttpClientAccessToken{.Value = fmt::format("Bearer {}"sv, Token), .ExpireTime = HttpClientAccessToken::TimePoint::max()}); } std::function CreateFromOAuthClientCredentials(const OAuthClientCredentialsParams& Params) { OAuthClientCredentialsParams OAuthParams(Params); return [OAuthParams]() { using namespace std::chrono; std::string Body = fmt::format("client_id={}&scope=cache_access&grant_type=client_credentials&client_secret={}"sv, OAuthParams.ClientId, OAuthParams.ClientSecret); cpr::Response Response = cpr::Post(cpr::Url{OAuthParams.Url}, cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"}}, cpr::Body{std::move(Body)}); if (Response.error || Response.status_code != 200) { return HttpClientAccessToken{}; } std::string JsonError; json11::Json Json = json11::Json::parse(Response.text, JsonError); if (JsonError.empty() == false) { return HttpClientAccessToken{}; } std::string Token = Json["access_token"].string_value(); int64_t ExpiresInSeconds = static_cast(Json["expires_in"].int_value()); HttpClientAccessToken::TimePoint ExpireTime = HttpClientAccessToken::Clock::now() + seconds(ExpiresInSeconds); return HttpClientAccessToken{.Value = fmt::format("Bearer {}"sv, Token), .ExpireTime = ExpireTime}; }; } std::function CreateFromOpenIdProvider(AuthMgr& AuthManager, std::string_view OpenIdProvider) { return [&AuthManager = AuthManager, OpenIdProvider = std::string(OpenIdProvider)]() { AuthMgr::OpenIdAccessToken Token = AuthManager.GetOpenIdAccessToken(OpenIdProvider); return HttpClientAccessToken{.Value = Token.AccessToken, .ExpireTime = Token.ExpireTime}; }; } std::function CreateFromDefaultOpenIdProvider(AuthMgr& AuthManager) { return CreateFromOpenIdProvider(AuthManager, "Default"sv); } }} // namespace zen::httpclientauth