Work on automatic ACCESS token renewals.
This commit is contained in:
parent
623379c11a
commit
783a15a0f5
2 changed files with 49 additions and 16 deletions
|
@ -53,7 +53,7 @@
|
||||||
|
|
||||||
OAuth2Service::OAuth2Service(QString authUrl, QString tokenUrl, QString clientId,
|
OAuth2Service::OAuth2Service(QString authUrl, QString tokenUrl, QString clientId,
|
||||||
QString clientSecret, QString scope, QObject* parent)
|
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_redirectUrl = QSL(INOREADER_OAUTH_CLI_REDIRECT);
|
||||||
m_tokenGrantType = QSL("authorization_code");
|
m_tokenGrantType = QSL("authorization_code");
|
||||||
|
@ -80,13 +80,13 @@ QString OAuth2Service::bearer() {
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return QString("Bearer %1").arg(m_accessToken);
|
return QString("Bearer %1").arg(accessToken());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OAuth2Service::isFullyLoggedIn() const {
|
bool OAuth2Service::isFullyLoggedIn() const {
|
||||||
bool is_expiration_valid = m_tokensExpireIn > QDateTime::currentDateTime();
|
bool is_expiration_valid = tokensExpireIn() > QDateTime::currentDateTime();
|
||||||
bool do_tokens_exist = !m_refreshToken.isEmpty() && !m_accessToken.isEmpty();
|
bool do_tokens_exist = !refreshToken().isEmpty() && !accessToken().isEmpty();
|
||||||
|
|
||||||
return is_expiration_valid && do_tokens_exist;
|
return is_expiration_valid && do_tokens_exist;
|
||||||
}
|
}
|
||||||
|
@ -99,6 +99,23 @@ QString OAuth2Service::oAuthTokenGrantType() {
|
||||||
return m_tokenGrantType;
|
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) {
|
void OAuth2Service::retrieveAccessToken(QString auth_code) {
|
||||||
QNetworkRequest networkRequest;
|
QNetworkRequest networkRequest;
|
||||||
|
|
||||||
|
@ -121,7 +138,7 @@ void OAuth2Service::retrieveAccessToken(QString auth_code) {
|
||||||
|
|
||||||
void OAuth2Service::refreshAccessToken(QString refresh_token) {
|
void OAuth2Service::refreshAccessToken(QString refresh_token) {
|
||||||
if (refresh_token.isEmpty()) {
|
if (refresh_token.isEmpty()) {
|
||||||
refresh_token = m_refreshToken;
|
refresh_token = refreshToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkRequest networkRequest;
|
QNetworkRequest networkRequest;
|
||||||
|
@ -163,14 +180,13 @@ void OAuth2Service::tokenRequestFinished(QNetworkReply* network_reply) {
|
||||||
else {
|
else {
|
||||||
int expires = rootObject.value(QL1S("expires_in")).toInt();
|
int expires = rootObject.value(QL1S("expires_in")).toInt();
|
||||||
|
|
||||||
m_accessToken = rootObject.value(QL1S("access_token")).toString();
|
setTokensExpireIn(QDateTime::currentDateTime().addSecs(expires));
|
||||||
m_refreshToken = rootObject.value(QL1S("refresh_token")).toString();
|
setAccessToken(rootObject.value(QL1S("access_token")).toString());
|
||||||
m_tokensExpireIn = QDateTime::currentDateTime().addSecs(expires);
|
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(accessToken(), refreshToken(), rootObject.value("expires_in").toInt());
|
||||||
emit tokensReceived(m_accessToken, m_refreshToken, rootObject.value("expires_in").toInt());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
network_reply->deleteLater();
|
network_reply->deleteLater();
|
||||||
|
@ -221,12 +237,14 @@ QString OAuth2Service::refreshToken() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OAuth2Service::setRefreshToken(const QString& refresh_token) {
|
void OAuth2Service::setRefreshToken(const QString& refresh_token) {
|
||||||
|
killRefreshTimer();
|
||||||
m_refreshToken = refresh_token;
|
m_refreshToken = refresh_token;
|
||||||
|
startRefreshTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OAuth2Service::login() {
|
bool OAuth2Service::login() {
|
||||||
bool did_token_expire = m_tokensExpireIn.isNull() || m_tokensExpireIn < QDateTime::currentDateTime();
|
bool did_token_expire = tokensExpireIn().isNull() || tokensExpireIn() < QDateTime::currentDateTime();
|
||||||
bool does_token_exist = !m_refreshToken.isEmpty();
|
bool does_token_exist = !refreshToken().isEmpty();
|
||||||
|
|
||||||
// We refresh current tokens only if:
|
// We refresh current tokens only if:
|
||||||
// 1. We have some existing refresh token.
|
// 1. We have some existing refresh token.
|
||||||
|
@ -246,10 +264,19 @@ bool OAuth2Service::login() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OAuth2Service::logout() {
|
void OAuth2Service::logout() {
|
||||||
m_refreshToken = m_accessToken = QString();
|
setTokensExpireIn(QDateTime());
|
||||||
m_tokensExpireIn = 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() {
|
void OAuth2Service::retrieveAuthCode() {
|
||||||
|
|
|
@ -108,9 +108,15 @@ class OAuth2Service : public QObject {
|
||||||
void logout();
|
void logout();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void startRefreshTimer();
|
||||||
|
void killRefreshTimer();
|
||||||
void tokenRequestFinished(QNetworkReply* network_reply);
|
void tokenRequestFinished(QNetworkReply* network_reply);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void timerEvent(QTimerEvent* event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_timerId;
|
||||||
QDateTime m_tokensExpireIn;
|
QDateTime m_tokensExpireIn;
|
||||||
QString m_accessToken;
|
QString m_accessToken;
|
||||||
QString m_refreshToken;
|
QString m_refreshToken;
|
||||||
|
|
Loading…
Add table
Reference in a new issue