2010-05-06 16 views
5

Uso la API de JavaScript de Google Data y tengo problemas para que la secuencia de comandos de AuthSub funcione correctamente. Esta es mi secuencia de comandos actualmente:Gdata JavaScript Authsub continúa redireccionando

google.load('gdata', '1'); 

function getCookie(c_name){ 
    if(document.cookie.length>0){ 
     c_start=document.cookie.indexOf(c_name + "="); 
     if(c_start!=-1){ 
      c_start=c_start + c_name.length+1; 
      c_end=document.cookie.indexOf(";",c_start); 
      if(c_end==-1) c_end=document.cookie.length; 
      return unescape(document.cookie.substring(c_start, c_end)); 
     } 
    } 
    return ""; 
} 

function main(){ 
    var scope = 'http://www.google.com/calendar/feeds/'; 
    if(!google.accounts.user.checkLogin(scope)){ 
     google.accounts.user.login(); 
    } else { 
     /* 
     * Retrieve all calendars 
     */ 

     // Create the calendar service object 
     var calendarService = new google.gdata.calendar.CalendarService('GoogleInc-jsguide-1.0'); 

     // The default "allcalendars" feed is used to retrieve a list of all 
     // calendars (primary, secondary and subscribed) of the logged-in user 
     var feedUri = 'http://www.google.com/calendar/feeds/default/allcalendars/full'; 

     // The callback method that will be called when getAllCalendarsFeed() returns feed data 
     var callback = function(result) { 

      // Obtain the array of CalendarEntry 
      var entries = result.feed.entry; 

      //for (var i = 0; i < entries.length; i++) { 
      var calendarEntry = entries[0]; 
      var calendarTitle = calendarEntry.getTitle().getText(); 
      alert('Calendar title = ' + calendarTitle); 
      //} 
     } 

     // Error handler to be invoked when getAllCalendarsFeed() produces an error 
     var handleError = function(error) { 
      alert(error); 
     } 

     // Submit the request using the calendar service object 
     calendarService.getAllCalendarsFeed(feedUri, callback, handleError); 
    } 
} 

google.setOnLoadCallback(main); 

Sin embargo, cuando ejecuto esto, la página me redirige a la página de autenticación. Después de autenticarlo, me envía de vuelta a mi página y luego rápidamente me envía de vuelta a la página de autenticación. He incluido alertas para verificar si el token se está configurando y parece que no funciona. ¿Alguien tiene este problema?

+2

el problema es que establecer la cookie demora un poco cuando google redirige a su sitio. Sin embargo, la devolución de llamada se ejecuta inmediatamente, y no hay cookies en ese momento para verificar la autenticación, por lo que vuelve a redireccionar a Google. Intenta usar 'setTimeout' o algo para ejecutar la verificación de autenticación después de un segundo o así, para estar seguro. – Anurag

+0

@Anurag: publica eso como respuesta y es posible que obtengas algún representante. Lo haría por ti, pero eso sería robar :) – Day

+0

gracias por la sugerencia @Día .. ideas para más representantes siempre bienvenidos :) – Anurag

Respuesta

1

el problema es que establecer la cookie demora un poco cuando google redirige a su sitio. Sin embargo, la devolución de llamada se ejecuta inmediatamente, y no hay cookies en ese momento para verificar la autenticación, por lo que vuelve a redireccionar a Google. Intenta usar setTimeout o algo para ejecutar la verificación de autenticación después de un segundo o así, para estar seguro.

0

También debe pasar el alcance al método de inicio de sesión.

0

A veces puede terminar con una cookie orphaned en su navegador, que seguirá recibiendo retroalimentación a Google.

Lo que estoy haciendo ahora, es hacer un checkLogin antes de realizar mi llamada de inicio de sesión, y si devuelve verdadero, llamo explícitamente al logOut().

La llamada de LogOut eliminará todas las cookies que Google rechazó pero dejó en su navegador. La razón por la que parece continuar en un bucle es porque la cookie está allí, pero incluso en reautorización, no produce una nueva porque ya tienes una. Pero lamentablemente por nuestro bien, el que está allí no es válido.

2

que estaba teniendo el mismo problema así que construí esta función

function login() { 
    var scope = "http://www.google.com/calendar/feeds/"; 
    if(!google.accounts.user.checkLogin(scope)) { 
     if(google.accounts.user.getStatus() == 0) { 
      var token = google.accounts.user.login(); 
     } 
    } 
} 

añadí el cheque a google.accounts.user.getStatus() si es 1 significa que la aplicación está en el proceso de registro en y si es 2 eso significa que las aplicaciones están conectadas. También puede pasar un alcance al método getStatus.

Cuestiones relacionadas