2010-10-02 28 views
6

He estado trabajando en mi cerebro durante unos días tratando de obtener una lista de calendarios de Google usando DotNetOpenAuth.DotNetOpenAuth con Google Calendar Feed

Puedo obtener con éxito una lista de contactos utilizando las muestras de DotNetOpenAuth. Lo he integrado con mi dominio usando OpenId + OAuth. Todo funciona bien para obtener una lista de contactos.

De ahí que modifiqué el código para tratar de recuperar una lista de calendarios y sigo obteniendo un error 401 no autorizado.

Sé que está autorizando porque puedo obtener la lista de contactos. ¿Alguien tiene un ejemplo de código de cómo están recuperando calendarios o eventos de calendario usando DotNetOpenAuth con Google?

Gracias

Actualización:

Gracias por la respuesta. He leído todo lo que puedo tener en mis manos. Aquí es lo que he hecho hasta ahora

Paso 1: He creado un nuevo GetCalendarEndPoint en los GoogleConsumer.cs

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

Paso 2: A continuación he creado un nuevo método GetCalendars el modelo del Método GetContacts en GoogleConsumer. cs - (reconstruido la DLL etc.)

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; 

Paso 3: En mi Solicitud he modificado el ScopeURI al calendario de URI de GoogleConsumer como sigue

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

Sin embargo, cuando ejecuto la aplicación consigo 401 no autorizado cuando hago la siguiente llamada

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

También han comprobado que existe el token State.GoogleAccess simplemente mostrarlo en la pantalla antes de disparar el método que hace esta llamada.

Una vez más, si exectute

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

entonces funciona ??????? Gracias por tu ayuda.

Respuesta

4

He estado sufriendo exactamente lo mismo la mayor parte del fin de semana.

Creo que después de mucho juguetear con Fiddler he encontrado la causa y tengo una solución que, aunque no es bonita, parece funcionar. Descubrí que podía acceder a la fuente de calendario copiando y pegando el URI generado por DNOA en un navegador, pero siempre obtenía un 401 cuando intentaba acceder a un programa. Aparentemente, esto se debe a que el comportamiento predeterminado de redirección automática de HttpWebRequest descarta las cookies que el redireccionamiento intenta establecer. El feed de contactos no establece cookies durante el redireccionamiento, por lo que es inmune.

La primera vez que solicita un feed de calendario (incluso con una solicitud de OAuth correctamente construida y firmada), Google responde con un redireccionamiento que contiene una cookie. Si no presenta esa "cookie de calendario" al mismo tiempo que su solicitud de alimentación, obtendrá un 401 no autorizado cuando intente seguir el redireccionamiento al feed.

aquí es la cabecera de la configuración de galletas de Google:

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

Esto es lo que estoy haciendo para hacer que funcione:

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

¿Has leído la documentación de la API de datos de Google Calendar para asegurarte de que tienes los puntos finales correctos programados? ¿También ha modificado el código que adquiere el token de acceso para solicitar acceso a Google Calendar además de los Contactos de Google? El token de acceso en la muestra solo obtiene permisos de Contactos a menos que lo cambie.

+0

¿Sería posible que tenga que ver con la forma en que estamos creando la solicitar ya que el punto final para Contactos es HTTP y el punto final para el Calendario es HTTPS? –

+1

Absolutamente eso podría ser. Y, por supuesto, la creación de MessageReceivingEndpoint es el código que usted controla para que pueda ajustarlo. –

+0

¿Puedes ver algo en mi código que estoy haciendo mal o señalarme en la dirección correcta? Esto realmente me está destrozando. –

Cuestiones relacionadas