2010-10-02 9 views
6

J'ai creusé mon cerveau pendant quelques jours en essayant d'obtenir une liste de calendriers de Google en utilisant DotNetOpenAuth.DotNetOpenAuth avec Google Calendar Feed

Je peux obtenir avec succès une liste de contacts en utilisant les échantillons DotNetOpenAuth. Je l'ai intégré avec mon domaine en utilisant OpenID + OAuth. Tout fonctionne bien pour obtenir une liste de contacts. À partir de là, j'ai modifié le code pour essayer de récupérer une liste de calendriers et je continue d'obtenir une erreur 401 non autorisée.

Je sais que c'est autorisé parce que je peux obtenir la liste de contacts. Quelqu'un at-il un exemple de code comment ils récupèrent des calendriers ou des événements de calendrier en utilisant le DotNetOpenAuth avec Google ???

Merci

Mise à jour:

Merci pour la réponse. J'ai lu tout ce que je peux trouver. Voici ce que je l'ai fait jusqu'à présent

Étape 1: Je créé un nouveau GetCalendarEndPoint dans les GoogleConsumer.cs

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

Étape 2: Ensuite, je créé une nouvelle GetCalendars méthode calquée sur la méthode GetContacts dans GoogleConsumer. cs - (Reconstruit la etc. dll)

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; 

Étape 3: Dans ma demande j'ai modifié le ScopeURI à l'URI Calendrier de GoogleConsumer comme suit

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

Cependant, quand je lance l'application que je reçois 401 Unauthorized quand je fais l'appel suivant

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

J'ai également vérifié que le jeton State.GoogleAccess existe en affichant simplement sur mon écran avant de déclencher la méthode qui fait cet appel.

Encore une fois, si j'exectute

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

il fonctionne ??????? Merci pour ton aide.

Répondre

4

J'ai souffert exactement la même chose pendant la majeure partie du week-end.

Je pense qu'après avoir beaucoup joué avec Fiddler, j'ai trouvé la cause et j'ai une solution qui, bien que pas jolie, semble fonctionner. J'ai découvert que j'étais en mesure d'accéder au flux du calendrier en copiant et en collant le code Uri généré par DNOA dans un navigateur, mais que je recevais toujours un 401 lorsque j'essayais d'accéder à un programme. C'est apparemment parce que le comportement de redirection automatique par défaut de HttpWebRequest rejette tous les cookies que la redirection tente de définir. Le flux Contacts ne définit aucun cookie lors de la redirection, il est donc protégé.La première fois que vous demandez un flux de calendrier (même avec une demande OAuth correctement créée et signée), Google répond avec une redirection contenant un cookie. Si vous ne présentez pas ce "cookie de calendrier" en même temps que votre demande de flux, vous obtiendrez un 401 non autorisé lorsque vous tenterez de suivre la redirection vers le flux.

est ici l'en-tête de fixation des cookies de Google:

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

Voici ce que je fais pour le faire fonctionner:

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

Avez-vous lu la documentation de l'API de données Google Agenda pour vous assurer que vous avez programmé les bons points de terminaison? Avez-vous également modifié le code qui acquiert le jeton d'accès pour demander l'accès à Google Agenda en plus des contacts Google? Le jeton d'accès dans l'exemple obtient uniquement les autorisations Contacts sauf si vous le modifiez.

+0

aurait-il peut-être à voir avec la façon dont nous créons la demande car le point de fin pour Contacts est HTTP et le point de fin pour le calendrier est HTTPS? –

+1

Absolument que ça pourrait être ça. Et bien sûr, la création de MessageReceivingEndpoint est du code que vous contrôlez, vous pouvez donc l'ajuster. –

+0

Pouvez-vous voir quelque chose dans mon code que je fais mal ou pointez-moi dans la bonne direction. Cela me bouscule vraiment. –