Wie Google-API-V 3.0 .Net-library und die Google-OAuth2 Umgang mit refresh token
In meiner Anwendung, ich bin mit Google-API-V 3.0 .Net-Bibliothek mit Google OAuth2 synchronisieren, Google Kalender und outlook Kalender. Ich verwende folgenden code, um die Google.Apis.Kalender.v3.CalendarService service-Objekt.
Während der Authentifizierung, die ich gespeichert werden, ist die Json-Datei und von der, die ich bin anfordern für Google.Apis.Auth.OAuth2."UserCredential" Objekt.
private Google.Apis.Auth.OAuth2.UserCredential GetGoogleOAuthCredential()
{
GoogleTokenModel _TokenData = new GoogleTokenModel();
String JsonFilelocation = "jsonFileLocation;
Google.Apis.Auth.OAuth2.UserCredential credential = null;
using (var stream = new FileStream(JsonFilelocation, FileMode.Open,
FileAccess.Read))
{
Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
credential = Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.AuthorizeAsync(
Google.Apis.Auth.OAuth2.GoogleClientSecrets.Load(stream).Secrets,
new[] { Google.Apis.Calendar.v3.CalendarService.Scope.Calendar },
"user",
CancellationToken.None,
new FileDataStore("OGSync.Auth.Store")).Result;
}
return credential;
}
Anfordern für Service-Objekt code :
Google.Apis.Calendar.v3.CalendarService _V3calendarService = new Google.Apis.Calendar.v3.CalendarService(new Google.Apis.Services.BaseClientService.Initializer()
{
HttpClientInitializer = GetGoogleOAuthCredential(),
ApplicationName = "TestApplication",
});
Obige code funktioniert gut, um die Calendarservice Objekt. Meine Frage ist, meine Json-Datei aktualisieren und access Token. wie der oben stehende code behandelt refresh token zu erhalten, den service, wenn access token abgelaufen ist? Da muss ich anrufen die Calendarservice Objekt Häufig, ich mag zur Umsetzung des singleton-Musters für calenderService Objekt. Wie man Calendarservice ohne Aufruf GetGoogleOAuthCredential Häufig? Jede Hilfe/Beratung wird sehr geschätzt.
- Überprüfen Sie auch stackoverflow.com/a/24972426/833846
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verbrachte die letzten zwei Tage herauszufinden dies selbst. Die Bibliothek nicht aktualisieren Sie das Token automatisch, es sei denn, Sie geben "access_type=offline".
https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth
Ich bin gonna fügen Sie den code, den ich verwende und wenn Sie irgendetwas nicht verstehen, Fragen Sie einfach. Ich habe gelesen, so viele posts und ich litteraly habe diese arbeiten gerade jetzt, so gibt es einige kommentierte code und es wurde nicht umgestaltet werden, noch. Ich hoffe, dies hilft jemand. Die NuGet-Pakete, die ich verwende, sind diese:
Google.Apis.Auth.MVC
Google.Apis.Kalender.v3
Code:
AuthCallbackController:
}
Methode der Controller-Aufruf der Google-API
Abgeleitete Klasse von FlowMetadata
Entity framework 6 DataStore-Klasse
Abgeleitete Klasse für GoogleAuthorizationCodeFlow. Ermöglicht lange gelebt refresh-token, die kümmern sich automatisch "aktualisieren" werden die token, die einfach bedeutet, dass man einen neuen access-token.
https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth
GoogleAuthItem mit EFDataStore
Das ist die butty von der client-Bibliothek! diese Magie ist automatisch für Sie erledigt 🙂
"UserCredential" implementiert sowohl IHttpExecuteInterceptor und IHttpUnsuccessfulResponseHandler. also immer dann, wenn der access-token wird abgelaufen sein, oder ist bereits abgelaufen, der client macht einen Aufruf an den authorization server, aktualisieren Sie das token, und bekommen Sie ein neues access token (gültig für die nächsten 60 Minuten).
Lesen Sie mehr darüber auf https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#credentials
Für mich-client-Bibliothek nicht erfrischend, nicht auch die Erstellung der refresh-token.
Ich überprüfen, ob der token abgelaufen ist und erneuert. (Token ist ein 1hour Lebensdauer). Anmeldeinformationen.Token.IsExpired wird Ihnen sagen, ob es abgelaufen ist, credential.Token.RefreshToken(userid) und aktualisieren Sie die erforderlichen token.