diff --git a/Yavsc/Helpers/GoogleHelpers.cs b/Yavsc/Helpers/GoogleHelpers.cs index d1d8f56f..54aad5ea 100644 --- a/Yavsc/Helpers/GoogleHelpers.cs +++ b/Yavsc/Helpers/GoogleHelpers.cs @@ -39,6 +39,8 @@ namespace Yavsc.Helpers using Google.Apis.Auth.OAuth2.Flows; using Google.Apis.Util.Store; using Google.Apis.Auth.OAuth2.Responses; + using Google.Apis.Util; + @@ -125,6 +127,11 @@ namespace Yavsc.Helpers throw new InvalidOperationException("No Google login"); var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer()); var token = await store.GetAsync(googleUserLoginKey); + // token != null + var c = SystemClock.Default; + if (token.IsExpired(c)) { + token = await RefreshToken(token); + } return new UserCredential(flow, googleUserLoginKey, token); } public static async Task GetFreeTime (this ICalendarManager manager, string calId, DateTime startDate, DateTime endDate) diff --git a/Yavsc/Services/GoogleApis/CalendarManager.cs b/Yavsc/Services/GoogleApis/CalendarManager.cs index 9c6ff9bd..ef9fbaab 100644 --- a/Yavsc/Services/GoogleApis/CalendarManager.cs +++ b/Yavsc/Services/GoogleApis/CalendarManager.cs @@ -36,6 +36,8 @@ namespace Yavsc.Services { using System.Threading; using Google.Apis.Auth.OAuth2.Flows; + using Google.Apis.Auth.OAuth2.Responses; + using Google.Apis.Util; using Yavsc.Helpers; using Yavsc.Models; using Yavsc.Models.Calendar; @@ -240,6 +242,10 @@ namespace Yavsc.Services var login = await _dbContext.GetGoogleUserLoginAsync(userId); if (login == null) return null; var token = await _flow.LoadTokenAsync(login.ProviderKey, CancellationToken.None); + var c = SystemClock.Default; + if (token.IsExpired(c)) { + token = await RefreshToken(token); + } UserCredential cred = new UserCredential(_flow,login.ProviderKey,token); return new CalendarService(new BaseClientService.Initializer() { @@ -247,5 +253,23 @@ namespace Yavsc.Services ApplicationName = "Yavsc" }); } + + public static async Task RefreshToken(TokenResponse oldResponse) + { + string ep = " https://www.googleapis.com/oauth2/v4/token"; + // refresh_token client_id client_secret grant_type=refresh_token + try { + using (var m = new SimpleJsonPostMethod(ep)) { + return await m.Invoke( + new { refresh_token= oldResponse.RefreshToken, client_id=Startup.GoogleSettings.ClientId, + client_secret=Startup.GoogleSettings.ClientSecret, + grant_type="refresh_token" } + ); + } + } + catch (Exception ex) { + throw new Exception ("Quelque chose s'est mal passé à l'envoi",ex); + } + } } }