Merge pull request #10544 from birarda/bug/refresh-access-token

require a valid access token and expiry to attempt token refresh
This commit is contained in:
Brad Hefta-Gaub 2017-05-25 08:35:18 -07:00 committed by GitHub
commit a0484c5f0b

View file

@ -193,7 +193,6 @@ void AccountManager::setAuthURL(const QUrl& authURL) {
// prepare to refresh our token if it is about to expire // prepare to refresh our token if it is about to expire
if (needsToRefreshToken()) { if (needsToRefreshToken()) {
qCDebug(networking) << "Refreshing access token since it will be expiring soon.";
refreshAccessToken(); refreshAccessToken();
} }
@ -457,7 +456,6 @@ bool AccountManager::hasValidAccessToken() {
} else { } else {
if (!_isWaitingForTokenRefresh && needsToRefreshToken()) { if (!_isWaitingForTokenRefresh && needsToRefreshToken()) {
qCDebug(networking) << "Refreshing access token since it will be expiring soon.";
refreshAccessToken(); refreshAccessToken();
} }
@ -477,7 +475,7 @@ bool AccountManager::checkAndSignalForAccessToken() {
} }
bool AccountManager::needsToRefreshToken() { bool AccountManager::needsToRefreshToken() {
if (!_accountInfo.getAccessToken().token.isEmpty()) { if (!_accountInfo.getAccessToken().token.isEmpty() && _accountInfo.getAccessToken().expiryTimestamp > 0) {
qlonglong expireThreshold = QDateTime::currentDateTime().addSecs(1 * 60 * 60).toMSecsSinceEpoch(); qlonglong expireThreshold = QDateTime::currentDateTime().addSecs(1 * 60 * 60).toMSecsSinceEpoch();
return _accountInfo.getAccessToken().expiryTimestamp < expireThreshold; return _accountInfo.getAccessToken().expiryTimestamp < expireThreshold;
} else { } else {
@ -555,28 +553,36 @@ void AccountManager::requestAccessTokenWithSteam(QByteArray authSessionTicket) {
void AccountManager::refreshAccessToken() { void AccountManager::refreshAccessToken() {
_isWaitingForTokenRefresh = true; // we can't refresh our access token if we don't have a refresh token, so check for that first
if (!_accountInfo.getAccessToken().refreshToken.isEmpty()) {
qCDebug(networking) << "Refreshing access token since it will be expiring soon.";
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); _isWaitingForTokenRefresh = true;
QNetworkRequest request; QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL; QNetworkRequest request;
grantURL.setPath("/oauth/token"); request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QByteArray postData; QUrl grantURL = _authURL;
postData.append("grant_type=refresh_token&"); grantURL.setPath("/oauth/token");
postData.append("refresh_token=" + QUrl::toPercentEncoding(_accountInfo.getAccessToken().refreshToken) + "&");
postData.append("scope=" + ACCOUNT_MANAGER_REQUESTED_SCOPE);
request.setUrl(grantURL); QByteArray postData;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); postData.append("grant_type=refresh_token&");
postData.append("refresh_token=" + QUrl::toPercentEncoding(_accountInfo.getAccessToken().refreshToken) + "&");
postData.append("scope=" + ACCOUNT_MANAGER_REQUESTED_SCOPE);
QNetworkReply* requestReply = networkAccessManager.post(request, postData); request.setUrl(grantURL);
connect(requestReply, &QNetworkReply::finished, this, &AccountManager::refreshAccessTokenFinished); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(refreshAccessTokenError(QNetworkReply::NetworkError)));
QNetworkReply* requestReply = networkAccessManager.post(request, postData);
connect(requestReply, &QNetworkReply::finished, this, &AccountManager::refreshAccessTokenFinished);
connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(refreshAccessTokenError(QNetworkReply::NetworkError)));
} else {
qCWarning(networking) << "Cannot refresh access token without refresh token."
<< "Access token will need to be manually refreshed.";
}
} }
void AccountManager::requestAccessTokenFinished() { void AccountManager::requestAccessTokenFinished() {