mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-16 19:31:02 +01:00
Re-authenticate to Drive when token expires.
This commit is contained in:
parent
894b293598
commit
0b97b8c74b
@ -89,6 +89,7 @@ ConnectResponse* Client::Connect(const QString& refresh_token) {
|
|||||||
void Client::ConnectFinished(ConnectResponse* response, OAuthenticator* oauth) {
|
void Client::ConnectFinished(ConnectResponse* response, OAuthenticator* oauth) {
|
||||||
oauth->deleteLater();
|
oauth->deleteLater();
|
||||||
access_token_ = oauth->access_token();
|
access_token_ = oauth->access_token();
|
||||||
|
expiry_time_ = oauth->expiry_time();
|
||||||
response->refresh_token_ = oauth->refresh_token();
|
response->refresh_token_ = oauth->refresh_token();
|
||||||
emit response->Finished();
|
emit response->Finished();
|
||||||
|
|
||||||
@ -186,3 +187,8 @@ void Client::GetFileFinished(GetFileResponse* response, QNetworkReply* reply) {
|
|||||||
response->file_ = File(result);
|
response->file_ = File(result);
|
||||||
emit response->Finished();
|
emit response->Finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Client::is_authenticated() const {
|
||||||
|
return !access_token_.isEmpty() &&
|
||||||
|
QDateTime::currentDateTime().secsTo(expiry_time_) > 0;
|
||||||
|
}
|
||||||
|
@ -135,7 +135,7 @@ class Client : public QObject {
|
|||||||
public:
|
public:
|
||||||
Client(QObject* parent = 0);
|
Client(QObject* parent = 0);
|
||||||
|
|
||||||
bool is_authenticated() const { return !access_token_.isEmpty(); }
|
bool is_authenticated() const;
|
||||||
const QString& access_token() const { return access_token_; }
|
const QString& access_token() const { return access_token_; }
|
||||||
|
|
||||||
ConnectResponse* Connect(const QString& refresh_token = QString());
|
ConnectResponse* Connect(const QString& refresh_token = QString());
|
||||||
@ -154,11 +154,12 @@ private:
|
|||||||
void AddAuthorizationHeader(QNetworkRequest* request) const;
|
void AddAuthorizationHeader(QNetworkRequest* request) const;
|
||||||
void MakeListFilesRequest(ListFilesResponse* response,
|
void MakeListFilesRequest(ListFilesResponse* response,
|
||||||
const QString& page_token = QString());
|
const QString& page_token = QString());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QNetworkAccessManager* network_;
|
QNetworkAccessManager* network_;
|
||||||
|
|
||||||
QString access_token_;
|
QString access_token_;
|
||||||
|
QDateTime expiry_time_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -18,6 +18,7 @@ namespace {
|
|||||||
const char* kGoogleOAuthEndpoint = "https://accounts.google.com/o/oauth2/auth";
|
const char* kGoogleOAuthEndpoint = "https://accounts.google.com/o/oauth2/auth";
|
||||||
const char* kGoogleOAuthTokenEndpoint =
|
const char* kGoogleOAuthTokenEndpoint =
|
||||||
"https://accounts.google.com/o/oauth2/token";
|
"https://accounts.google.com/o/oauth2/token";
|
||||||
|
const char* kGoogleOAuthScope = "https://www.googleapis.com/auth/drive.readonly";
|
||||||
|
|
||||||
const char* kClientId = "679260893280.apps.googleusercontent.com";
|
const char* kClientId = "679260893280.apps.googleusercontent.com";
|
||||||
const char* kClientSecret = "l3cWb8efUZsrBI4wmY3uKl6i";
|
const char* kClientSecret = "l3cWb8efUZsrBI4wmY3uKl6i";
|
||||||
@ -38,7 +39,7 @@ void OAuthenticator::StartAuthorisation() {
|
|||||||
url.addQueryItem("response_type", "code");
|
url.addQueryItem("response_type", "code");
|
||||||
url.addQueryItem("client_id", kClientId);
|
url.addQueryItem("client_id", kClientId);
|
||||||
url.addQueryItem("redirect_uri", QString("http://localhost:%1").arg(port));
|
url.addQueryItem("redirect_uri", QString("http://localhost:%1").arg(port));
|
||||||
url.addQueryItem("scope", "https://www.googleapis.com/auth/drive.readonly");
|
url.addQueryItem("scope", kGoogleOAuthScope);
|
||||||
|
|
||||||
QDesktopServices::openUrl(url);
|
QDesktopServices::openUrl(url);
|
||||||
}
|
}
|
||||||
@ -157,6 +158,7 @@ void OAuthenticator::FetchAccessTokenFinished(QNetworkReply* reply) {
|
|||||||
|
|
||||||
access_token_ = result["access_token"].toString();
|
access_token_ = result["access_token"].toString();
|
||||||
refresh_token_ = result["refresh_token"].toString();
|
refresh_token_ = result["refresh_token"].toString();
|
||||||
|
SetExpiryTime(result["expires_in"].toInt());
|
||||||
|
|
||||||
emit Finished();
|
emit Finished();
|
||||||
}
|
}
|
||||||
@ -187,6 +189,12 @@ void OAuthenticator::RefreshAuthorisation(const QString& refresh_token) {
|
|||||||
SLOT(RefreshAccessTokenFinished(QNetworkReply*)), reply);
|
SLOT(RefreshAccessTokenFinished(QNetworkReply*)), reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OAuthenticator::SetExpiryTime(int expires_in_seconds) {
|
||||||
|
// Set the expiry time with two minutes' grace.
|
||||||
|
expiry_time_ = QDateTime::currentDateTime().addSecs(expires_in_seconds - 120);
|
||||||
|
qLog(Debug) << "Current Google Drive token expires at:" << expiry_time_;
|
||||||
|
}
|
||||||
|
|
||||||
void OAuthenticator::RefreshAccessTokenFinished(QNetworkReply* reply) {
|
void OAuthenticator::RefreshAccessTokenFinished(QNetworkReply* reply) {
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
QJson::Parser parser;
|
QJson::Parser parser;
|
||||||
@ -194,5 +202,6 @@ void OAuthenticator::RefreshAccessTokenFinished(QNetworkReply* reply) {
|
|||||||
|
|
||||||
QVariantMap result = parser.parse(reply, &ok).toMap();
|
QVariantMap result = parser.parse(reply, &ok).toMap();
|
||||||
access_token_ = result["access_token"].toString();
|
access_token_ = result["access_token"].toString();
|
||||||
|
SetExpiryTime(result["expires_in"].toInt());
|
||||||
emit Finished();
|
emit Finished();
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef OAUTHENTICATOR_H
|
#ifndef OAUTHENTICATOR_H
|
||||||
#define OAUTHENTICATOR_H
|
#define OAUTHENTICATOR_H
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTcpServer>
|
#include <QTcpServer>
|
||||||
|
|
||||||
@ -21,6 +22,8 @@ class OAuthenticator : public QObject {
|
|||||||
// Token to use to get a new access token when it expires.
|
// Token to use to get a new access token when it expires.
|
||||||
const QString& refresh_token() const { return refresh_token_; }
|
const QString& refresh_token() const { return refresh_token_; }
|
||||||
|
|
||||||
|
const QDateTime& expiry_time() const { return expiry_time_; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void Finished();
|
void Finished();
|
||||||
|
|
||||||
@ -33,12 +36,14 @@ class OAuthenticator : public QObject {
|
|||||||
private:
|
private:
|
||||||
QByteArray ParseHttpRequest(const QByteArray& request) const;
|
QByteArray ParseHttpRequest(const QByteArray& request) const;
|
||||||
void RequestAccessToken(const QByteArray& code, quint16 port);
|
void RequestAccessToken(const QByteArray& code, quint16 port);
|
||||||
|
void SetExpiryTime(int expires_in_seconds);
|
||||||
|
|
||||||
QTcpServer server_;
|
QTcpServer server_;
|
||||||
NetworkAccessManager network_;
|
NetworkAccessManager network_;
|
||||||
|
|
||||||
QString access_token_;
|
QString access_token_;
|
||||||
QString refresh_token_;
|
QString refresh_token_;
|
||||||
|
QDateTime expiry_time_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user