From cd260c662f8a487968ccc6d510a24f76ba485bf9 Mon Sep 17 00:00:00 2001 From: Yunze Xu Date: Tue, 8 Mar 2022 12:53:29 +0800 Subject: [PATCH] [C++] Fix wrong unit of Access Token Response's `expires_in` field (#14554) ### Motivation The `expires_in` field of Access Token Response is in seconds. See https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2. However, C++ client treats it as milliseconds currently. It will leads to an earlier expiration of the token. ### Modifications Record the time point via the `std::time_point` class, which supports add operations with a `std::duration` object. Then converts the `expires_in` field via `std::chrono::second` function and calculate the expired time point. It also removes the usage of Boost time functions and makes code more clear. (cherry picked from commit 95c1581d494d59c4d93782eb18547cec5427b503) (cherry picked from commit 669ce98f25dbb2ef0ef4d9525ea788fed593a28b) --- pulsar-client-cpp/lib/auth/AuthOauth2.cc | 15 ++------------- pulsar-client-cpp/lib/auth/AuthOauth2.h | 5 ++++- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.cc b/pulsar-client-cpp/lib/auth/AuthOauth2.cc index 0fc935a4f7536..334289dd35231 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.cc +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.cc @@ -23,7 +23,6 @@ #include #include #include -#include #include DECLARE_LOG_OBJECT() @@ -86,22 +85,12 @@ CachedToken::~CachedToken() {} // Oauth2CachedToken -static int64_t currentTimeMillis() { - using namespace boost::posix_time; - using boost::posix_time::milliseconds; - using boost::posix_time::seconds; - static ptime time_t_epoch(boost::gregorian::date(1970, 1, 1)); - - time_duration diff = microsec_clock::universal_time() - time_t_epoch; - return diff.total_milliseconds(); -} - Oauth2CachedToken::Oauth2CachedToken(Oauth2TokenResultPtr token) { latest_ = token; int64_t expiredIn = token->getExpiresIn(); if (expiredIn > 0) { - expiresAt_ = expiredIn + currentTimeMillis(); + expiresAt_ = Clock::now() + std::chrono::seconds(expiredIn); } else { throw std::runtime_error("ExpiresIn in Oauth2TokenResult invalid value: " + std::to_string(expiredIn)); @@ -113,7 +102,7 @@ AuthenticationDataPtr Oauth2CachedToken::getAuthData() { return authData_; } Oauth2CachedToken::~Oauth2CachedToken() {} -bool Oauth2CachedToken::isExpired() { return expiresAt_ < currentTimeMillis(); } +bool Oauth2CachedToken::isExpired() { return expiresAt_ < Clock::now(); } // OauthFlow diff --git a/pulsar-client-cpp/lib/auth/AuthOauth2.h b/pulsar-client-cpp/lib/auth/AuthOauth2.h index b3cc9525acd3e..59e8ad9320a69 100644 --- a/pulsar-client-cpp/lib/auth/AuthOauth2.h +++ b/pulsar-client-cpp/lib/auth/AuthOauth2.h @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include @@ -69,13 +70,15 @@ class ClientCredentialFlow : public Oauth2Flow { class Oauth2CachedToken : public CachedToken { public: + using Clock = std::chrono::high_resolution_clock; + Oauth2CachedToken(Oauth2TokenResultPtr token); ~Oauth2CachedToken(); bool isExpired(); AuthenticationDataPtr getAuthData(); private: - int64_t expiresAt_; + std::chrono::time_point expiresAt_; Oauth2TokenResultPtr latest_; AuthenticationDataPtr authData_; };