5

Sto tentando di utilizzare AccessToken fornito da Owin in Google. Richieste API ma sto ricevendo l'eccezione System.InvalidOperationException (Informazioni aggiuntive: Il token di accesso è scaduto ma non è possibile aggiornarlo).Come posso utilizzare ASP.NET MVC Owin AccessToken in Google. Chiamare Apis?

La mia configurazione di Google Authentication è OK e posso accedere con successo alla mia applicazione. Conservo il contesto.AccessToken come reclamo nella richiamata di autenticazione ("evento" OnAuthenticated di GoogleOAuth2AuthenticationProvider).

mio Startup.Auth.cs configurazione (app.UseGoogleAuthentication (ConfigureGooglePlus()))

private GoogleOAuth2AuthenticationOptions ConfigureGooglePlus() 
{ 
var goolePlusOptions = new GoogleOAuth2AuthenticationOptions() 
{ 
    ClientId = "Xxxxxxx.apps.googleusercontent.com", 
    ClientSecret = "YYYYYYzzzzzz", 
    Provider = new GoogleOAuth2AuthenticationProvider() 
    { 
     OnAuthenticated = context => 
     { 
      context.Identity.AddClaim(new System.Security.Claims.Claim("Google_AccessToken", context.AccessToken)); 
      return Task.FromResult(0); 
     } 
    }, 
    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie 
}; 

goolePlusOptions.Scope.Add("https://www.googleapis.com/auth/plus.login"); 
goolePlusOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email"); 

return goolePlusOptions; 

}

Il codice in cui viene gettato l'eccezione (Execute() metodo)

var externalIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); 

var accessTokenClaim = externalIdentity.FindAll(loginProvider + "_AccessToken").First(); 

var secrets = new ClientSecrets() 
{ 
    ClientId = "Xxxxxxx.apps.googleusercontent.com", 
    ClientSecret = "YYYYYYzzzzzz" 
}; 

IAuthorizationCodeFlow flow = 
    new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer 
    { 
     ClientSecrets = secrets, 
     Scopes = new[] { PlusService.Scope.PlusLogin, PlusService.Scope.UserinfoEmail } 
    }); 

UserCredential credential = new UserCredential(flow, "me", new TokenResponse() { AccessToken = accessTokenClaim.Value }); 

var ps = new PlusService(
    new BaseClientService.Initializer() 
    { 
     ApplicationName = "My App Name", 
     HttpClientInitializer = credential 
    }); 

var k = ps.People.List("me", PeopleResource.ListRequest.CollectionEnum.Visible).Execute(); 

c'è un altro modo per ottenere l'access token o Refre originale sh it senza passare attraverso l'intero processo di autenticazione (l'utente è già autenticato)?

Ho bisogno di interrogare alcuni dati del profilo di GooglePlus come GivenName, familyName, genere, immagine del profilo e URL del profilo.

+0

** UPDATE ** ho ottenuto il lavoro utilizzando il i valori ottenuti tramite "OAuth 2.0 Playground" e il problema di metterlo in funzione è che il RefreshToken è nullo nel contesto e non so come ottenerne uno nuovo. –

+0

Non ho ancora provato quello che stai facendo. Ma quando richiedi l'accesso da google devi aggiungere anche AccessType offline per dire al server di autenticazione di restituire un refreshtoken all'utente. La libreria client dovrebbe gestirla per te. – DaImTo

+0

Potete allegare l'eccezione? Non sono sicuro che tu possa ottenere il RefreshToken dall'Identità esterna, ma ti consiglio di iniziare a investigarlo, poiché la libreria client deve avere un token di aggiornamento per mantenere il tuo token di accesso fresco (scade dopo 60 minuti) – peleyal

risposta

5

Linda mi ha aiutato con un URL che punta a un nuovo campione di asp.net mvc (https://codereview.appspot.com/194980043/).

Ho appena dovuto aggiungere AccessType = "offline" a GoogleOAuth2AuthenticationOptions e salvare alcune informazioni extra per creare una nuova istanza di TokenResponse quando necessario. Opzioni

di autenticazione di Google

private GoogleOAuth2AuthenticationOptions ConfigureGooglePlus() 
{ 

    var goolePlusOptions = new GoogleOAuth2AuthenticationOptions() 
    { 
     AccessType = "offline", 
     ClientId = "Xxxxxxx.apps.googleusercontent.com", 
     ClientSecret = "Yyyyyyyyyy", 
     Provider = new GoogleOAuth2AuthenticationProvider() 
     { 
      OnAuthenticated = context => 
      { 
       context.Identity.AddClaim(new System.Security.Claims.Claim("Google_AccessToken", context.AccessToken)); 

       if (context.RefreshToken != null) 
       { 
        context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken)); 
       } 
       context.Identity.AddClaim(new Claim("GoogleUserId", context.Id)); 
       context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToString())); 
       var expiresInSec = (long)(context.ExpiresIn.Value.TotalSeconds); 
       context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToString())); 


       return Task.FromResult(0); 
      } 
     }, 

     SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie 
    }; 

    goolePlusOptions.Scope.Add("https://www.googleapis.com/auth/plus.login"); 
    goolePlusOptions.Scope.Add("https://www.googleapis.com/auth/plus.me"); 
    goolePlusOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email"); 

    return goolePlusOptions; 
} 

Come recuperare le credenziali (utilizzando informazioni di token "memorizzato", come affermazione)

Problemi correlati