Work on automatic ACCESS token renewals.

This commit is contained in:
Martin Rotter 2017-10-09 12:52:50 +02:00
parent 623379c11a
commit 783a15a0f5
2 changed files with 49 additions and 16 deletions

View File

@ -53,7 +53,7 @@
OAuth2Service::OAuth2Service(QString authUrl, QString tokenUrl, QString clientId,
QString clientSecret, QString scope, QObject* parent)
: QObject(parent), m_tokensExpireIn(QDateTime()) {
: QObject(parent), m_timerId(-1), m_tokensExpireIn(QDateTime()) {
m_redirectUrl = QSL(INOREADER_OAUTH_CLI_REDIRECT);
m_tokenGrantType = QSL("authorization_code");
@ -80,13 +80,13 @@ QString OAuth2Service::bearer() {
return QString();
}
else {
return QString("Bearer %1").arg(m_accessToken);
return QString("Bearer %1").arg(accessToken());
}
}
bool OAuth2Service::isFullyLoggedIn() const {
bool is_expiration_valid = m_tokensExpireIn > QDateTime::currentDateTime();
bool do_tokens_exist = !m_refreshToken.isEmpty() && !m_accessToken.isEmpty();
bool is_expiration_valid = tokensExpireIn() > QDateTime::currentDateTime();
bool do_tokens_exist = !refreshToken().isEmpty() && !accessToken().isEmpty();
return is_expiration_valid && do_tokens_exist;
}
@ -99,6 +99,23 @@ QString OAuth2Service::oAuthTokenGrantType() {
return m_tokenGrantType;
}
void OAuth2Service::timerEvent(QTimerEvent* event) {
if (m_timerId >= 0 && event->timerId() == m_timerId) {
event->accept();
if (tokensExpireIn() < QDateTime::currentDateTime()) {
// We try to refresh access token, because it probably expires soon.
qDebug("Refreshing automatically access token.");
refreshAccessToken();
}
else {
qDebug("Access token is not expired yet.");
}
}
QObject::timerEvent(event);
}
void OAuth2Service::retrieveAccessToken(QString auth_code) {
QNetworkRequest networkRequest;
@ -121,7 +138,7 @@ void OAuth2Service::retrieveAccessToken(QString auth_code) {
void OAuth2Service::refreshAccessToken(QString refresh_token) {
if (refresh_token.isEmpty()) {
refresh_token = m_refreshToken;
refresh_token = refreshToken();
}
QNetworkRequest networkRequest;
@ -163,14 +180,13 @@ void OAuth2Service::tokenRequestFinished(QNetworkReply* network_reply) {
else {
int expires = rootObject.value(QL1S("expires_in")).toInt();
m_accessToken = rootObject.value(QL1S("access_token")).toString();
m_refreshToken = rootObject.value(QL1S("refresh_token")).toString();
m_tokensExpireIn = QDateTime::currentDateTime().addSecs(expires);
setTokensExpireIn(QDateTime::currentDateTime().addSecs(expires));
setAccessToken(rootObject.value(QL1S("access_token")).toString());
setRefreshToken(rootObject.value(QL1S("refresh_token")).toString());
qDebug() << "Obtained refresh token" << m_refreshToken << "- expires on date/time" << m_tokensExpireIn;
qDebug() << "Obtained refresh token" << refreshToken() << "- expires on date/time" << tokensExpireIn();
// TODO: Start timer to refresh tokens?
emit tokensReceived(m_accessToken, m_refreshToken, rootObject.value("expires_in").toInt());
emit tokensReceived(accessToken(), refreshToken(), rootObject.value("expires_in").toInt());
}
network_reply->deleteLater();
@ -221,12 +237,14 @@ QString OAuth2Service::refreshToken() const {
}
void OAuth2Service::setRefreshToken(const QString& refresh_token) {
killRefreshTimer();
m_refreshToken = refresh_token;
startRefreshTimer();
}
bool OAuth2Service::login() {
bool did_token_expire = m_tokensExpireIn.isNull() || m_tokensExpireIn < QDateTime::currentDateTime();
bool does_token_exist = !m_refreshToken.isEmpty();
bool did_token_expire = tokensExpireIn().isNull() || tokensExpireIn() < QDateTime::currentDateTime();
bool does_token_exist = !refreshToken().isEmpty();
// We refresh current tokens only if:
// 1. We have some existing refresh token.
@ -246,10 +264,19 @@ bool OAuth2Service::login() {
}
void OAuth2Service::logout() {
m_refreshToken = m_accessToken = QString();
m_tokensExpireIn = QDateTime();
setTokensExpireIn(QDateTime());
setAccessToken(QString());
setRefreshToken(QString());
}
// TODO: zastavit timer na obnovení refresh tokenu?
void OAuth2Service::startRefreshTimer() {
if (!refreshToken().isEmpty()) {
m_timerId = startTimer(15, Qt::VeryCoarseTimer);
}
}
void OAuth2Service::killRefreshTimer() {
killTimer(m_timerId);
}
void OAuth2Service::retrieveAuthCode() {

View File

@ -108,9 +108,15 @@ class OAuth2Service : public QObject {
void logout();
private slots:
void startRefreshTimer();
void killRefreshTimer();
void tokenRequestFinished(QNetworkReply* network_reply);
private:
void timerEvent(QTimerEvent* event);
private:
int m_timerId;
QDateTime m_tokensExpireIn;
QString m_accessToken;
QString m_refreshToken;