public override async Task Prepare(CancellationToken cancellation) {
if (IsReady && DateTime.Now < _authExpiration) return;
var data = InternalUtils.GetGoogleDriveCredentials();
var clientId = data.Item1.Substring(2);
var clientSecret = data.Item2.Substring(2);
var enc = ValuesStorage.GetEncryptedString(KeyAuthToken);
if (enc == null) return;
try {
_authToken = JsonConvert.DeserializeObject<AuthResponse>(enc);
} catch (Exception) {
Logging.Warning("Can’t load auth token");
return;
}
if (DateTime.Now < _authExpiration) {
IsReady = true;
return;
}
var refresh = await Request.Post<RefreshResponse>(@"https://www.googleapis.com/oauth2/v4/token", new NameValueCollection {
{ @"client_id", clientId },
{ @"client_secret", clientSecret },
{ @"refresh_token", _authToken.RefreshToken },
{ @"grant_type", @"refresh_token" }
}.GetQuery(), null, cancellation);
if (cancellation.IsCancellationRequested) return;
if (refresh == null) {
ValuesStorage.Remove(KeyAuthToken);
} else {
_authToken.AccessToken = refresh.AccessToken;
_authExpiration = DateTime.Now + TimeSpan.FromSeconds(refresh.ExpiresIn) - TimeSpan.FromSeconds(20);
ValuesStorage.SetEncrypted(KeyAuthToken, JsonConvert.SerializeObject(_authToken));
ValuesStorage.Set(KeyAuthExpiration, _authExpiration);
IsReady = true;
}
}