Cloud: Handle refresh of access token.

This commit is contained in:
Kristian Bendiksen
2024-07-12 18:51:22 +02:00
parent a8004870d4
commit 896e4979bf
4 changed files with 77 additions and 30 deletions

View File

@@ -25,6 +25,7 @@
#include "RiaSumoDefines.h"
#include <QAbstractOAuth>
#include <QDateTime>
#include <QDesktopServices>
#include <QEventLoop>
#include <QNetworkAccessManager>
@@ -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,11 +176,20 @@ void RiaCloudConnector::requestFailed( const QAbstractOAuth::Error error )
//--------------------------------------------------------------------------------------------------
void RiaCloudConnector::requestToken()
{
if ( m_token.isEmpty() )
if ( token().isEmpty() )
{
RiaLogging::debug( "Requesting token." );
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
{
RiaLogging::debug( "Has token: skipping token request." );
@@ -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();
}
//--------------------------------------------------------------------------------------------------

View File

@@ -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;
};

View File

@@ -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<OsduWellLog> 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 );
}
//--------------------------------------------------------------------------------------------------

View File

@@ -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 );