2010-10-02 20 views
6

Mi sono tormentato per qualche giorno cercando di ottenere un elenco di calendari da Google utilizzando DotNetOpenAuth.DotNetOpenAuth con Google Calendar Feed

Posso ottenere correttamente un elenco di contatti utilizzando gli esempi DotNetOpenAuth. L'ho integrato con il mio dominio usando OpenId + OAuth. Tutto funziona alla grande per ottenere un elenco di contatti.

Quindi da lì ho modificato il codice per provare a recuperare un elenco di calendari e continuo a ricevere un errore 401 non autorizzato.

So che è l'autorizzazione perché posso ottenere l'elenco dei contatti. Qualcuno ha un esempio di codice su come stanno recuperando calendari o eventi del calendario usando DotNetOpenAuth con Google ???

Grazie

Aggiornamento:

Grazie per la risposta. Ho letto tutto ciò su cui riesco a mettere le mani. Ecco quello che ho fatto finora

Fase 1: Ho creato un nuovo GetCalendarEndPoint nelle GoogleConsumer.cs

private static readonly MessageReceivingEndpoint GetCalendarEndpoint = new MessageReceivingEndpoint("https://www.google.com/calendar/feeds/default", HttpDeliveryMethods.GetRequest); 

Fase 2: Poi ho creato un nuovo metodo GetCalendars fantasia dopo la getContacts Metodo GoogleConsumer. cs - (Ricostruita la dll ecc)

public static XDocument GetCalendars(ConsumerBase consumer, string accessToken, int maxResults/* = 25*/, int startIndex/* = 1*/) { 
      if (consumer == null) 
      { 
       throw new ArgumentNullException("consumer"); 
      } 

      var request = consumer.PrepareAuthorizedRequest(GetCalendarEndpoint, accessToken); 
      var response = consumer.Channel.WebRequestHandler.GetResponse(request); 
      string body = response.GetResponseReader().ReadToEnd(); 
      XDocument result = XDocument.Parse(body); 
      return result; 

Fase 3: nella mia applicazione ho modificato lo ScopeURI al calendario URI da GoogleConsumer come segue

private IAuthenticationRequest GetGoogleRequest() 
{ 
    Realm realm = Request.Url.Scheme + Uri.SchemeDelimiter + Global.GoogleTokenManager.ConsumerKey + "/"; 
    IAuthenticationRequest authReq = relyingParty.CreateRequest(GoogleOPIdentifier, realm); 

    // Prepare the OAuth extension 
    string scope = GoogleConsumer.GetScopeUri(GoogleConsumer.Applications.Calendar); 
    Global.GoogleWebConsumer.AttachAuthorizationRequest(authReq, scope); 

    // We also want the user's email address 
    var fetch = new FetchRequest(); 
    fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
    authReq.AddExtension(fetch); 

    return authReq; 
} 

Tuttavia, quando faccio funzionare l'applicazione ottengo 401 non autorizzato quando faccio la seguente chiamata

var calendars = GoogleConsumer.GetCalendars(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1); 

ho anche verificato che il token State.GoogleAccess esiste semplicemente la visualizzazione sul mio schermo prima di innescare la metodo che effettua questa chiamata.

Anche in questo caso, se io exectute

var calendars = GoogleConsumer.GetContacs(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1); 

allora funziona ??????? Grazie per il tuo aiuto.

risposta

4

Ho sofferto attraverso esattamente la stessa cosa per la maggior parte del weekend.

Penso che dopo aver lavorato molto con Fiddler ho trovato la causa e una soluzione che, sebbene non carina, sembra funzionare. Ho scoperto che ero in grado di accedere al feed del calendario copiando e incollando l'Uri generato da DNOA in un browser, ma ottenevo sempre un 401 quando si tentava di accedere a un accesso programmatico. Ciò è apparentemente dovuto al comportamento di reindirizzamento automatico predefinito di HttpWebRequest che elimina tutti i cookie che il reindirizzamento sta tentando di impostare. Il feed Contatti non imposta alcun cookie durante il reindirizzamento, quindi è immune.

La prima volta che si richiede un feed del calendario (anche con una richiesta OAuth firmata correttamente e firmata), Google risponde con un reindirizzamento contenente un cookie. Se non si presenta quel "cookie del calendario" contemporaneamente alla richiesta del feed, si otterrà un 401 Non autorizzato quando si tenta di seguire il reindirizzamento al feed.

ecco l'intestazione impostazione cookie da Google:

HTTP/1.1 302 Moved Temporarily 
Set-Cookie: S=calendar=y7AlfgbmcqYl0ugrF-Zt9A;Expires=Tue, 10-Jan-2012 03:54:20 GMT;Secure 

Ecco quello che sto facendo per farlo funzionare:

// wc: WebConsumer 
var calRequest = wc.PrepareAuthorizedRequest(erp2, authTokenRsp.AccessToken); 
// need to stop redirect to capture calendar cookie token: 
calRequest.AllowAutoRedirect = false; 
var calResponse = calRequest.GetResponse(); 
var redirectCookie = calResponse.Headers[System.Net.HttpResponseHeader.SetCookie]; 

var cookiedCalRequest = wc.PrepareAuthorizedRequest(erp2, authTokenRsp.AccessToken); 
cookiedCalRequest.Headers[System.Net.HttpRequestHeader.Cookie] = redirectCookie; 
var calFeedResponse = cookiedCalRequest.GetResponse(); 
1

Hai letto la documentazione dell'API dei dati di Google Calendar per assicurarti di avere programmato gli endpoint giusti? Hai anche modificato il codice che acquisisce il token di accesso per richiedere l'accesso a Google Calendar oltre ai Contatti Google? Il token di accesso nell'esempio ottiene solo le autorizzazioni Contatti a meno che non lo si modifichi.

+0

sarebbe eventualmente avere a che fare con il modo in cui stiamo creando la richiesta dal momento che il punto finale per Contatti è HTTP e il punto finale per il Calendario è HTTPS? –

+1

Assolutamente potrebbe essere. E ovviamente la creazione di MessageReceivingEndpoint è il codice che controlli, in modo da poterlo aggiustare. –

+0

Riesci a vedere qualcosa nel mio codice che sto sbagliando o indicarmi la giusta direzione. Questo mi sta davvero bloccando. –

Problemi correlati