From 896e4979bf68d89d92d6ab2add5b2b4f64ad31ee Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 12 Jul 2024 18:51:22 +0200 Subject: [PATCH] Cloud: Handle refresh of access token. --- .../Tools/Cloud/RiaCloudConnector.cpp | 74 +++++++++++++++---- .../Tools/Cloud/RiaCloudConnector.h | 6 +- .../Tools/Cloud/RiaOsduConnector.cpp | 13 ++-- .../Tools/Cloud/RiaSumoConnector.cpp | 14 ++-- 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.cpp b/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.cpp index ddcf50d1bf..3939a81da8 100644 --- a/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.cpp +++ b/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.cpp @@ -25,6 +25,7 @@ #include "RiaSumoDefines.h" #include +#include #include #include #include @@ -100,6 +101,30 @@ RiaCloudConnector::RiaCloudConnector( QObject* parent, SIGNAL( authorizationCallbackReceived( const QVariantMap& ) ), this, SLOT( authorizationCallbackReceived( const QVariantMap& ) ) ); + + connect( m_authCodeFlow, + &QOAuth2AuthorizationCodeFlow::tokenChanged, + this, + [&]( const QString& token ) + { + RiaLogging::debug( "Access token changed." ); + exportTokenToFile(); + } ); + + connect( m_authCodeFlow, + &QOAuth2AuthorizationCodeFlow::refreshTokenChanged, + this, + [&]( const QString& refreshToken ) + { + RiaLogging::debug( "Refresh token changed." ); + exportTokenToFile(); + } ); + + connect( m_authCodeFlow, + &QOAuth2AuthorizationCodeFlow::expirationAtChanged, + this, + [&]( const QDateTime& expiration ) + { RiaLogging::debug( QString( "Access token expiration changed: %1" ).arg( expiration.toString() ) ); } ); } //-------------------------------------------------------------------------------------------------- @@ -114,12 +139,8 @@ RiaCloudConnector::~RiaCloudConnector() //-------------------------------------------------------------------------------------------------- void RiaCloudConnector::accessGranted() { - m_token = m_authCodeFlow->token(); - - QString tokenDataJson = RiaConnectorTools::tokenDataAsJson( m_authCodeFlow ); - RiaConnectorTools::writeTokenData( m_tokenDataFilePath, tokenDataJson ); - - emit tokenReady( m_token ); + QString currentToken = m_authCodeFlow->token(); + emit tokenReady( currentToken ); } //-------------------------------------------------------------------------------------------------- @@ -155,10 +176,19 @@ void RiaCloudConnector::requestFailed( const QAbstractOAuth::Error error ) //-------------------------------------------------------------------------------------------------- void RiaCloudConnector::requestToken() { - if ( m_token.isEmpty() ) + if ( token().isEmpty() ) { - RiaLogging::debug( "Requesting token." ); - m_authCodeFlow->grant(); + RiaLogging::debug( "No valid access token found." ); + if ( !m_authCodeFlow->refreshToken().isEmpty() ) + { + RiaLogging::info( "Refreshing access token with refresh token." ); + m_authCodeFlow->refreshAccessToken(); + } + else + { + RiaLogging::info( "Requesting token." ); + m_authCodeFlow->grant(); + } } else { @@ -172,7 +202,25 @@ void RiaCloudConnector::requestToken() //-------------------------------------------------------------------------------------------------- QString RiaCloudConnector::token() const { - return m_token; + QString currentToken = m_authCodeFlow->token(); + QDateTime expiration = m_authCodeFlow->expirationAt(); + if ( !currentToken.isEmpty() && expiration.isValid() && expiration > QDateTime::currentDateTime() ) + { + return currentToken; + } + else + { + return QString(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaCloudConnector::exportTokenToFile() +{ + QString tokenDataJson = RiaConnectorTools::tokenDataAsJson( m_authCodeFlow ); + RiaConnectorTools::writeTokenData( m_tokenDataFilePath, tokenDataJson ); } //-------------------------------------------------------------------------------------------------- @@ -184,7 +232,6 @@ void RiaCloudConnector::importTokenFromFile() if ( !tokenDataJson.isEmpty() ) { RiaConnectorTools::initializeTokenDataFromJson( m_authCodeFlow, tokenDataJson ); - m_token = m_authCodeFlow->token(); } } @@ -217,7 +264,8 @@ QString RiaCloudConnector::constructTokenUrl( const QString& authority ) //-------------------------------------------------------------------------------------------------- QString RiaCloudConnector::requestTokenBlocking() { - if ( !m_token.isEmpty() ) return m_token; + QString currentToken = token(); + if ( !currentToken.isEmpty() ) return currentToken; QTimer timer; timer.setSingleShot( true ); @@ -227,7 +275,7 @@ QString RiaCloudConnector::requestTokenBlocking() requestToken(); timer.start( RiaSumoDefines::requestTimeoutMillis() ); loop.exec(); - return m_token; + return m_authCodeFlow->token(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.h b/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.h index 9983b060f6..9d5e7b6fa0 100644 --- a/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.h +++ b/ApplicationLibCode/Application/Tools/Cloud/RiaCloudConnector.h @@ -42,13 +42,14 @@ public: QString token() const; void importTokenFromFile(); + void exportTokenToFile(); + void setTokenDataFilePath( const QString& filePath ); QString server() const; public slots: void requestToken(); - void accessGranted(); void requestFailed( const QAbstractOAuth::Error error ); signals: @@ -57,6 +58,7 @@ signals: private slots: void errorReceived( const QString& error, const QString& errorDescription, const QUrl& uri ); void authorizationCallbackReceived( const QVariantMap& data ); + void accessGranted(); protected: QString requestTokenBlocking(); @@ -72,7 +74,5 @@ protected: const QString m_scopes; const QString m_clientId; - QString m_token; - QString m_tokenDataFilePath; }; diff --git a/ApplicationLibCode/Application/Tools/Cloud/RiaOsduConnector.cpp b/ApplicationLibCode/Application/Tools/Cloud/RiaOsduConnector.cpp index 6d1a71b1ee..90d4470192 100644 --- a/ApplicationLibCode/Application/Tools/Cloud/RiaOsduConnector.cpp +++ b/ApplicationLibCode/Application/Tools/Cloud/RiaOsduConnector.cpp @@ -77,7 +77,7 @@ void RiaOsduConnector::requestFieldsByName( const QString& token, const QString& //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestFieldsByName( const QString& fieldName ) { - requestFieldsByName( m_token, fieldName ); + requestFieldsByName( token(), fieldName ); } //-------------------------------------------------------------------------------------------------- @@ -113,7 +113,7 @@ void RiaOsduConnector::requestFieldsByName( const QString& server, const QString //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestWellsByFieldId( const QString& fieldId ) { - requestWellsByFieldId( m_server, m_dataPartitionId, m_token, fieldId ); + requestWellsByFieldId( m_server, m_dataPartitionId, token(), fieldId ); } //-------------------------------------------------------------------------------------------------- @@ -149,7 +149,7 @@ void RiaOsduConnector::requestWellsByFieldId( const QString& server, const QStri //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestWellboresByWellId( const QString& wellId ) { - requestWellboresByWellId( m_server, m_dataPartitionId, m_token, wellId ); + requestWellboresByWellId( m_server, m_dataPartitionId, token(), wellId ); } //-------------------------------------------------------------------------------------------------- @@ -200,7 +200,7 @@ std::vector RiaOsduConnector::requestWellLogsByWellboreIdBlocking( //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestWellLogsByWellboreId( const QString& wellboreId ) { - requestWellLogsByWellboreId( m_server, m_dataPartitionId, m_token, wellboreId ); + requestWellLogsByWellboreId( m_server, m_dataPartitionId, token(), wellboreId ); } //-------------------------------------------------------------------------------------------------- @@ -239,7 +239,7 @@ void RiaOsduConnector::requestWellLogsByWellboreId( const QString& server, //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestWellboreTrajectoryByWellboreId( const QString& wellboreId ) { - requestWellboreTrajectoryByWellboreId( m_server, m_dataPartitionId, m_token, wellboreId ); + requestWellboreTrajectoryByWellboreId( m_server, m_dataPartitionId, token(), wellboreId ); } //-------------------------------------------------------------------------------------------------- @@ -709,8 +709,7 @@ void RiaOsduConnector::requestWellLogParquetDataById( const QString& wellLogId ) //-------------------------------------------------------------------------------------------------- void RiaOsduConnector::requestParquetDataByUrl( const QString& url, const QString& id ) { - QString token = m_token; - requestParquetData( url, m_dataPartitionId, token, id ); + requestParquetData( url, m_dataPartitionId, token(), id ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/Cloud/RiaSumoConnector.cpp b/ApplicationLibCode/Application/Tools/Cloud/RiaSumoConnector.cpp index 2e080eefff..1d2ea2a4ef 100644 --- a/ApplicationLibCode/Application/Tools/Cloud/RiaSumoConnector.cpp +++ b/ApplicationLibCode/Application/Tools/Cloud/RiaSumoConnector.cpp @@ -95,7 +95,7 @@ void RiaSumoConnector::requestCasesForField( const QString& fieldName ) QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( constructSearchUrl( m_server ) ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); QString payloadTemplate = R"( { @@ -156,7 +156,7 @@ void RiaSumoConnector::requestAssets() QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( m_server + "/api/v1/userpermissions" ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); auto reply = m_networkAccessManager->get( m_networkRequest ); @@ -218,7 +218,7 @@ void RiaSumoConnector::requestEnsembleByCasesId( const SumoCaseId& caseId ) QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( m_server + "/api/v1/search" ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); auto payload = payloadTemplate.arg( caseId.get() ); auto reply = m_networkAccessManager->post( m_networkRequest, payload.toUtf8() ); @@ -291,7 +291,7 @@ void RiaSumoConnector::requestVectorNamesForEnsemble( const SumoCaseId& caseId, QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( m_server + "/api/v1/search" ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); auto payload = payloadTemplate.arg( caseId.get() ).arg( ensembleName ); auto reply = m_networkAccessManager->post( m_networkRequest, payload.toUtf8() ); @@ -360,7 +360,7 @@ void RiaSumoConnector::requestRealizationIdsForEnsemble( const SumoCaseId& caseI QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( m_server + "/api/v1/search" ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); auto payload = payloadTemplate.arg( caseId.get() ).arg( ensembleName ); auto reply = m_networkAccessManager->post( m_networkRequest, payload.toUtf8() ); @@ -423,7 +423,7 @@ void RiaSumoConnector::requestBlobIdForEnsemble( const SumoCaseId& caseId, const QNetworkRequest m_networkRequest; m_networkRequest.setUrl( QUrl( m_server + "/api/v1/search" ) ); - addStandardHeader( m_networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( m_networkRequest, token(), RiaDefines::contentTypeJson() ); auto payload = payloadTemplate.arg( caseId.get() ).arg( ensembleName ).arg( vectorName ); auto reply = m_networkAccessManager->post( m_networkRequest, payload.toUtf8() ); @@ -469,7 +469,7 @@ void RiaSumoConnector::requestBlobDownload( const QString& blobId ) // did not work. Use ManualRedirectPolicy instead, and inspect the reply for the redirection target. networkRequest.setAttribute( QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy ); - addStandardHeader( networkRequest, m_token, RiaDefines::contentTypeJson() ); + addStandardHeader( networkRequest, token(), RiaDefines::contentTypeJson() ); auto reply = m_networkAccessManager->get( networkRequest );