2015-07-03 14 views
11

Sto tentando di utilizzare lo Google Calendar API nell'applicazione Web .NET non MVC . (Questo sembra essere una distinzione importante.)Come imposto return_uri per GoogleWebAuthorizationBroker.AuthorizeAsync?

ho ’ ho cercato di usare il codice da this example a Google e al this example Daimto insieme ad alcuni suggerimenti utili da un certo numero di related posts here.

ho scritto il seguente metodo:

public void GetUserCredential(String userName) 
{ 
    String clientId = ConfigurationManager.AppSettings[ "Google.ClientId" ];   //From Google Developer console https://console.developers.google.com 
    String clientSecret = ConfigurationManager.AppSettings[ "Google.ClientSecret" ]; //From Google Developer console https://console.developers.google.com 
    String[] scopes = new string[] { 
      Google.Apis.Calendar.v3.CalendarService.Scope.Calendar   
    }; 

    // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
    UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets 
    { 
     ClientId = clientId, 
     ClientSecret = clientSecret    
    }, scopes, userName, CancellationToken.None, new FileDataStore("c:\\temp")).Result; 

    // TODO: Replace FileDataStore with DatabaseDataStore 
} 

Il problema è che, quando Google ’ s pagina OAuth2 si chiama, redirect_uri mantiene sempre impostato http://localhost:<some-random-port>/authorize. Non ho idea di come impostare questo a qualcosa d'altro, come nel seguente esempio URL generato da AuthorizeAsync:

https://accounts.google.com/o/oauth2/auth?access_type=offline 
    &response_type=code 
    &client_id=********.apps.googleusercontent.com 
    &redirect_uri=http:%2F%2Flocalhost:40839%2Fauthorize%2F 
    &scope=https:%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar 

Google risponde con un redirect_uri_mismatch pagina di errore con il messaggio:

“ Il reindirizzare URI nella richiesta: http://localhost:XXXXX/authorize/ non corrisponde con un redirect registrato URI ”

posso registrare solo tante redirect URI ’ s nel mio Google Developer ’ s Console Cr pagina degli editori. I ’ m non è incline a registrare le porte 65535 e desidero utilizzare una pagina diversa da /authorize sul mio sito. Nello specifico, desidero utilizzare, durante lo sviluppo, http://localhost:888/Pages/GoogleApiRedirect ma non ho idea di dove impostare questo, al di là di ciò che ho fatto nella console dello sviluppatore ’.

Come impostare in modo esplicito il valore di redirect_uri? Sono anche aperto a una risposta nel modulo “ Questo approccio è completamente sbagliato. ”

EDIT:

Dopo aver giocato con questo negli ultimi giorni, ho scoperto che utilizzando il Segreto ID Client/Client per l'applicazione nativa, piuttosto che l'applicazione Web, posso almeno avere alla pagina di autorizzazione web di Google senza lamentarsi di uno redirect_uri_mismatch. Questo è ancora inaccettabile, perché ritorna ancora a http://localhost:<some-random-port>/authorize, che è al di fuori del controllo della mia applicazione web.

+0

Hai provato la configurazione di Visual Studio per utilizzare una porta predefinita per il vostro progetto web app? controlla questa documentazione, così puoi definire una porta e usarla nella tua console per sviluppatori. https://msdn.microsoft.com/en-us/library/ms178109(v=vs.140).aspx – Gerardo

+0

Grazie per il suggerimento, @ Gerardo. Sì, è già preconfigurato per la porta 888. Ho provato anche porte "non privilegiate" superiori a 1024. Ho visto questo suggerimento in alcune situazioni simili alla mia. Se funzionasse, suppongo che potrei vivere con '/ authorize' come la mia pagina di reindirizzamento. Non una soluzione ideale, ma una con cui potrei vivere. –

+0

Puoi anche provare a distribuire il progetto direttamente in IIS, da lì puoi avere più controllo sulla porta per la tua app web. https://msdn.microsoft.com/en-us/library/vstudio/dd465323(v=vs.100).aspx – Gerardo

risposta

10

È possibile utilizzare questo codice: (idea originale da http://coderissues.com/questions/27512300/how-to-append-login-hint-usergmail-com-to-googlewebauthorizationbroker)

dsAuthorizationBroker.RedirectUri = "my localhost redirect uri"; 
UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync(... 

dsAuthorizationBroker.cs

using System; 
using System.Collections.Generic; 
using System.Threading; 
using System.Threading.Tasks; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Auth.OAuth2.Flows; 
using Google.Apis.Auth.OAuth2.Requests; 
using Google.Apis.Util.Store; 

namespace OAuth2 
{  
    public class dsAuthorizationBroker : GoogleWebAuthorizationBroker 
    { 
     public static string RedirectUri; 

     public new static async Task<UserCredential> AuthorizeAsync(
      ClientSecrets clientSecrets, 
      IEnumerable<string> scopes, 
      string user, 
      CancellationToken taskCancellationToken, 
      IDataStore dataStore = null) 
     { 
      var initializer = new GoogleAuthorizationCodeFlow.Initializer 
      { 
       ClientSecrets = clientSecrets, 
      }; 
      return await AuthorizeAsyncCore(initializer, scopes, user, 
       taskCancellationToken, dataStore).ConfigureAwait(false); 
     } 

     private static async Task<UserCredential> AuthorizeAsyncCore(
      GoogleAuthorizationCodeFlow.Initializer initializer, 
      IEnumerable<string> scopes, 
      string user, 
      CancellationToken taskCancellationToken, 
      IDataStore dataStore) 
     { 
      initializer.Scopes = scopes; 
      initializer.DataStore = dataStore ?? new FileDataStore(Folder); 
      var flow = new dsAuthorizationCodeFlow(initializer); 
      return await new AuthorizationCodeInstalledApp(flow, 
       new LocalServerCodeReceiver()) 
       .AuthorizeAsync(user, taskCancellationToken).ConfigureAwait(false); 
     } 
    } 


    public class dsAuthorizationCodeFlow : GoogleAuthorizationCodeFlow 
    { 
     public dsAuthorizationCodeFlow(Initializer initializer) 
      : base(initializer) { } 

     public override AuthorizationCodeRequestUrl 
         CreateAuthorizationCodeRequest(string redirectUri) 
     { 
      return base.CreateAuthorizationCodeRequest(dsAuthorizationBroker.RedirectUri); 
     } 
    }  
} 
+1

Grazie mille per questo. – FrenkyB

+0

ricevi token con questo codice? – FrenkyB

+0

Questa risposta non aiuta affatto. non viene spiegato nulla ... semplicemente agitando una bacchetta magica e facendolo funzionare in un modo arcano e imperscrutabile, in realtà non risponde alla domanda originale, che è "perché il codice originale non funziona?" – user275801

Problemi correlati