From 5f1db0be10c004ad486053cc188a8b56447815b5 Mon Sep 17 00:00:00 2001 From: rangao Date: Sat, 4 Jun 2022 11:52:47 +0800 Subject: [PATCH 1/3] generate correct well known openid configuration url by issuer url end with a slash --- pulsar-client-cpp/lib/auth/AuthOauth2.cc | 14 +++++++++++++- pulsar-client-cpp/lib/auth/AuthOauth2.h | 1 + pulsar-client-cpp/tests/AuthPluginTest.cc | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.cc b/pulsar-client-cpp/lib/auth/AuthOauth2.cc index 334289dd35231..3990a4f21f1a7 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.cc +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.cc @@ -143,6 +143,18 @@ ClientCredentialFlow::ClientCredentialFlow(ParamMap& params) audience_(params["audience"]), scope_(params["scope"]) {} +const std::string ClientCredentialFlow::getWellKnownOpenIdConfigurationUrl() { + if (issuerUrl_.empty()) { + LOG_ERROR("Failed to get well known openid configuration: issuer_url is not set"); + return ""; + } + std::string configurationUrl = issuerUrl_; + if (configurationUrl.back() == '/') { + configurationUrl.pop_back(); + } + return configurationUrl.append("/.well-known/openid-configuration"); +} + static size_t curlWriteCallback(void* contents, size_t size, size_t nmemb, void* responseDataPtr) { ((std::string*)responseDataPtr)->append((char*)contents, size * nmemb); return size * nmemb; @@ -168,7 +180,7 @@ void ClientCredentialFlow::initialize() { curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "GET"); // set URL: well-know endpoint - curl_easy_setopt(handle, CURLOPT_URL, (issuerUrl_ + "/.well-known/openid-configuration").c_str()); + curl_easy_setopt(handle, CURLOPT_URL, getWellKnownOpenIdConfigurationUrl().c_str()); // Write callback curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, curlWriteCallback); diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.h b/pulsar-client-cpp/lib/auth/AuthOauth2.h index 59e8ad9320a69..81eef7d2af68e 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.h +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.h @@ -58,6 +58,7 @@ class ClientCredentialFlow : public Oauth2Flow { void close(); ParamMap generateParamMap() const; + const std::string getWellKnownOpenIdConfigurationUrl(); private: std::string tokenEndPoint_; diff --git a/pulsar-client-cpp/tests/AuthPluginTest.cc b/pulsar-client-cpp/tests/AuthPluginTest.cc index be987e07c4860..2b7e357ff7c0b 100644 --- a/pulsar-client-cpp/tests/AuthPluginTest.cc +++ b/pulsar-client-cpp/tests/AuthPluginTest.cc @@ -412,6 +412,20 @@ TEST(AuthPluginTest, testOauth2RequestBody) { ASSERT_EQ(flow2.generateParamMap(), expectedResult2); } +TEST(AuthPluginTest, getWellKnownOpenIdConfigurationUrl) { + std::string issuerUrl = "https://dev-kt-aa9ne.us.auth0.com"; + std::string configurationUrl = "https://dev-kt-aa9ne.us.auth0.com/.well-known/openid-configuration"; + + ParamMap params; + params["issuer_url"] = issuerUrl; + ClientCredentialFlow flow1(params); + ASSERT_EQ(flow1.getWellKnownOpenIdConfigurationUrl(), configurationUrl); + + params["issuer_url"] = issuerUrl.append("/"); + ClientCredentialFlow flow2(params); + ASSERT_EQ(flow2.getWellKnownOpenIdConfigurationUrl(), configurationUrl); +} + TEST(AuthPluginTest, testOauth2Failure) { ParamMap params; auto addKeyValue = [&](const std::string& key, const std::string& value) { From 2709c9919c9c88f0d109b007748f872245a331a4 Mon Sep 17 00:00:00 2001 From: rangao Date: Mon, 6 Jun 2022 16:36:19 +0800 Subject: [PATCH 2/3] add method `ClientCredentialFlow::getTokenEndPoint` and add test for the method `ClientCredentialFlow::initialize`. --- pulsar-client-cpp/lib/auth/AuthOauth2.cc | 19 ++++++++----------- pulsar-client-cpp/lib/auth/AuthOauth2.h | 2 +- pulsar-client-cpp/tests/AuthPluginTest.cc | 16 +++++++++++----- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.cc b/pulsar-client-cpp/lib/auth/AuthOauth2.cc index 3990a4f21f1a7..4bc5e8c814b2a 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.cc +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.cc @@ -143,16 +143,8 @@ ClientCredentialFlow::ClientCredentialFlow(ParamMap& params) audience_(params["audience"]), scope_(params["scope"]) {} -const std::string ClientCredentialFlow::getWellKnownOpenIdConfigurationUrl() { - if (issuerUrl_.empty()) { - LOG_ERROR("Failed to get well known openid configuration: issuer_url is not set"); - return ""; - } - std::string configurationUrl = issuerUrl_; - if (configurationUrl.back() == '/') { - configurationUrl.pop_back(); - } - return configurationUrl.append("/.well-known/openid-configuration"); +std::string ClientCredentialFlow::getTokenEndPoint() const { + return tokenEndPoint_; } static size_t curlWriteCallback(void* contents, size_t size, size_t nmemb, void* responseDataPtr) { @@ -180,7 +172,12 @@ void ClientCredentialFlow::initialize() { curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "GET"); // set URL: well-know endpoint - curl_easy_setopt(handle, CURLOPT_URL, getWellKnownOpenIdConfigurationUrl().c_str()); + std::string wellKnownUrl = issuerUrl_; + if (wellKnownUrl.back() == '/') { + wellKnownUrl.pop_back(); + } + wellKnownUrl.append("/.well-known/openid-configuration"); + curl_easy_setopt(handle, CURLOPT_URL,wellKnownUrl.c_str()); // Write callback curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, curlWriteCallback); diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.h b/pulsar-client-cpp/lib/auth/AuthOauth2.h index 81eef7d2af68e..c940cf969853e 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.h +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.h @@ -58,7 +58,7 @@ class ClientCredentialFlow : public Oauth2Flow { void close(); ParamMap generateParamMap() const; - const std::string getWellKnownOpenIdConfigurationUrl(); + std::string getTokenEndPoint() const; private: std::string tokenEndPoint_; diff --git a/pulsar-client-cpp/tests/AuthPluginTest.cc b/pulsar-client-cpp/tests/AuthPluginTest.cc index 2b7e357ff7c0b..01c19ebbea484 100644 --- a/pulsar-client-cpp/tests/AuthPluginTest.cc +++ b/pulsar-client-cpp/tests/AuthPluginTest.cc @@ -412,18 +412,24 @@ TEST(AuthPluginTest, testOauth2RequestBody) { ASSERT_EQ(flow2.generateParamMap(), expectedResult2); } -TEST(AuthPluginTest, getWellKnownOpenIdConfigurationUrl) { +TEST(AuthPluginTest, testInitialize) { std::string issuerUrl = "https://dev-kt-aa9ne.us.auth0.com"; - std::string configurationUrl = "https://dev-kt-aa9ne.us.auth0.com/.well-known/openid-configuration"; + std::string expectedTokenEndPoint = issuerUrl + "/oauth/token"; ParamMap params; params["issuer_url"] = issuerUrl; + params["client_id"] = "Xd23RHsUnvUlP7wchjNYOaIfazgeHd9x"; + params["client_secret"] = "rT7ps7WY8uhdVuBTKWZkttwLdQotmdEliaM5rLfmgNibvqziZ-g07ZH52N_poGAb"; + params["audience"] = "https://dev-kt-aa9ne.us.auth0.com/api/v2/"; + ClientCredentialFlow flow1(params); - ASSERT_EQ(flow1.getWellKnownOpenIdConfigurationUrl(), configurationUrl); + flow1.initialize(); + ASSERT_EQ(flow1.getTokenEndPoint(), expectedTokenEndPoint); - params["issuer_url"] = issuerUrl.append("/"); + params["issuer_url"] = issuerUrl + "/"; ClientCredentialFlow flow2(params); - ASSERT_EQ(flow2.getWellKnownOpenIdConfigurationUrl(), configurationUrl); + flow2.initialize(); + ASSERT_EQ(flow2.getTokenEndPoint(), expectedTokenEndPoint); } TEST(AuthPluginTest, testOauth2Failure) { From e89dc1514f95845020e4541f49a81ef3c76595de Mon Sep 17 00:00:00 2001 From: rangao Date: Tue, 7 Jun 2022 09:30:42 +0800 Subject: [PATCH 3/3] fix code format --- pulsar-client-cpp/lib/auth/AuthOauth2.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.cc b/pulsar-client-cpp/lib/auth/AuthOauth2.cc index 4bc5e8c814b2a..c7f944da75b17 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.cc +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.cc @@ -143,9 +143,7 @@ ClientCredentialFlow::ClientCredentialFlow(ParamMap& params) audience_(params["audience"]), scope_(params["scope"]) {} -std::string ClientCredentialFlow::getTokenEndPoint() const { - return tokenEndPoint_; -} +std::string ClientCredentialFlow::getTokenEndPoint() const { return tokenEndPoint_; } static size_t curlWriteCallback(void* contents, size_t size, size_t nmemb, void* responseDataPtr) { ((std::string*)responseDataPtr)->append((char*)contents, size * nmemb); @@ -177,7 +175,7 @@ void ClientCredentialFlow::initialize() { wellKnownUrl.pop_back(); } wellKnownUrl.append("/.well-known/openid-configuration"); - curl_easy_setopt(handle, CURLOPT_URL,wellKnownUrl.c_str()); + curl_easy_setopt(handle, CURLOPT_URL, wellKnownUrl.c_str()); // Write callback curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, curlWriteCallback);