2010-10-02 22 views
6

Od kilku dni próbuję uzyskać listę kalendarzy od Google za pomocą DotNetOpenAuth.DotNetOpenAuth z kanałem kalendarza Google

Udało mi się uzyskać listę kontaktów za pomocą próbek DotNetOpenAuth. Zintegrujełem go z moją domeną przy użyciu OpenAd + OAuth. Wszystko działa świetnie, aby uzyskać listę kontaktów.

Stamtąd zmodyfikowałem kod, aby pobrać listę kalendarzy i nadal otrzymuję błąd 401 nieautoryzowany.

Wiem, że autoryzacja jest możliwa, ponieważ mogę uzyskać listę kontaktów. Czy ktoś ma przykład kodu, jak pobierają kalendarze lub zdarzenia kalendarza za pomocą DotNetOpenAuth z Google ???

Dzięki

Aktualizacja:

Dzięki za odpowiedź. Przeczytałem wszystko, co mogę dostać w swoje ręce. Oto co zrobiłem do tej pory

Krok 1: Stworzyłem nową GetCalendarEndPoint w GoogleConsumer.cs

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

Krok 2: Następnie stworzyłem nowe GetCalendars metody wzorowane na metodzie GetContacts w GoogleConsumer. cs - (przebudowany dll itd.)

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; 

Krok 3: W mojej aplikacji zmodyfikował ScopeURI do Kalendarza URI z GoogleConsumer następująco

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; 
} 

Jednak gdy uruchamiam aplikację otrzymuję 401 Nieuprawnione kiedy robię następujące wywołanie

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

Mam również sprawdził, czy token State.GoogleAccess istnieje po prostu wyświetlając go na ekranie przed wyzwolić metoda, która wykonuje to połączenie.

Ponownie, jeśli exectute

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

to działa ??????? Dzięki za pomoc.

Odpowiedz

4

Cierpię przez dokładnie to samo przez większą część weekendu.

Myślę, że po wielu błahostkach z Fiddleriem znalazłem przyczynę i mam rozwiązanie, które choć nie jest ładne, wydaje się działać. Zauważyłem, że udało mi się uzyskać dostęp do kanału kalendarza, kopiując i wklejając URI generowane przez DNOA do przeglądarki, ale zawsze otrzymałem 401 przy próbie dostępu programowego. Jest tak, ponieważ domyślne zachowanie automatycznego przekierowania HttpWebRequest odrzuca wszystkie pliki cookie, które próbuje ustawić przekierowanie. Kanał Kontakty nie ustawia żadnych plików cookie podczas przekierowania, więc jest odporny.

Podczas pierwszego żądania kanału kalendarza (nawet z prawidłowo skonstruowanym i podpisanym żądaniem OAuth), Google odpowiada za pomocą przekierowania zawierającego plik cookie. Jeśli nie przedstawisz tego "pliku cookie kalendarza" w tym samym czasie, co żądanie kanału, otrzymasz 401 nieautoryzowane przy próbie wykonania przekierowania do kanału.

oto nagłówek cookies ustawienie od Google:

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

Oto co robię, aby to działało:

// 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

Czy przeczytałeś dokumentację interfejsu API danych Google Calendar, aby upewnić się, że masz odpowiednie punkty końcowe? Czy zmodyfikowałeś również kod, który nabył token dostępu, aby poprosić o dostęp do Kalendarza Google oprócz Kontaktów Google? Token dostępu w próbie otrzymuje tylko uprawnienia do kontaktów, chyba że je zmienisz.

+0

Czy to może mieć do czynienia z sposób kreujemy żądanie, ponieważ punktem końcowym dla Kontaktów jest HTTP, a punktem końcowym kalendarza jest HTTPS? –

+1

Absolutnie to może być to. Oczywiście tworzenie MessageReceivingEndpoint jest kodem, który kontrolujesz, dzięki czemu możesz to zmienić. –

+0

Czy widzisz coś w moim kodzie robię źle lub wskaż mnie we właściwym kierunku. To mnie naprawdę denerwuje. –

Powiązane problemy