2014-12-28 20 views
7

Ho scritto un app MVC utilizzando Google OAuth2 come indicato qui: https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web_applicationsScadenza del token di accesso OAuth di Google nell'app MVC?

Ho un problema con accesso scadenza del token. Quando token di accesso scade, ottengo l'eccezione quando si chiama Google API: "Il token di accesso è scaduto, ma non possiamo aggiornare lo"

L'autenticazione iniziale è di due iterazioni meccanismo:

prima iterazione restituisce AuthorizeAsync risultato con credenziali vuota, e popolato RedirectUri:

Così, l'url di autorizzazione creato è questa:

https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=code&client_id=MYCLIENTID&redirect_uri=http:%2F%2Flocalhost%2FHomepage%2FAuthCallback%2FIndexAsync&scope=https:%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar https:%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&state=http:%2F%2Flocalhost%2FHomepage%2F95419199 

Nota che tipo_accesso = non in linea un nuovo CD nel t. Quindi dovrei recuperare anche il token di aggiornamento (non succede).

enter image description here

seconda iterazione - ritorni AuthorizeAsync risultato con credenziali popolate e vuoto RedirectUri:

Question1 - è RefreshToken dovrebbe essere nullo in questo momento?

enter image description here

Il risultato è ricordato, dal momento che è definita come statica.

richiesta successiva che viene in - l'azione del calendario che richiede result.Credential chiamare Google Calendar API:

Question2 - se token di accesso scade da quel momento (per il test ho appena impostato ExpiresInSeconds = 0), Chiamo il metodo RefreshTokenAsync, ma restituisce sempre false! Perché? Cosa mi manca qui?

E quale sarebbe il modo corretto per gestire quando RefreshTokenAsync restituisce false? Il comando RedirectResult corrente (result.RedirectUri) avrà esito negativo poiché result.RedirectUri è null.

enter image description here

risposta

8

Oh, ho finalmente capito :) Per coloro che interessati - token di aggiornamento viene rilasciato solo una volta, quando si ottiene quello schermo consenso, dove si deve fare clic su Sì.

Così, al fine di ottenere token di aggiornamento, vai alle impostazioni conto, Autorizzazioni account: https://security.google.com/settings/security/permissions

e revocare l'accesso per il progetto si è configurato in Google Developers Console: https://console.developers.google.com/project

Ora, mettere un punto di interruzione nella riga successiva, dopo aver chiamato AuthorizeAsync, riavviare l'applicazione in modalità Debug, ottenere la schermata di consenso che richiede autorizzazioni, fare clic su Accetta.

L'app tornerà su VS e si fermerà sul punto di interruzione.

Ora, registra da qualche parte il risultato.Credential.Token.Valore RefreshToken, è una stringa crittografata.

Ho inserito la mia app in web.config per semplicità.

Ora, assegno nuovamente quel valore a result.Credential.Token.RefreshToken = refreshToken;

e ogni volta che il token di accesso scade, lo aggiornerà automaticamente.

enter image description here

Come qui quando chiamo GmailService request.Execute (...) passando l'oggetto credenziale che contiene il token, il token sarà aggiornata.

enter image description here