2010-05-06 15 views
5

Ich benutze die JavaScript Google Data API und habe Probleme damit das AuthSub Skript korrekt funktioniert. Das ist mein momentanes Skript:Gdata JavaScript Authsub setzt Redirect fort

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

Wenn ich das aber ausführe, leitet mich die Seite zur Authentifizierungsseite weiter. Nachdem ich mich authentifiziert habe, sende mich zurück auf meine Seite und schicke mich dann schnell zurück auf die Authentifizierungsseite. Ich habe Warnungen hinzugefügt, um zu überprüfen, ob das Token gesetzt wird und es scheint nicht zu funktionieren. Hat jemand dieses Problem?

+2

Das Problem ist, dass das Setzen des Cookies etwas Zeit in Anspruch nimmt, wenn Google zu Ihrer Website weiterleitet. Der Rückruf wird jedoch sofort ausgeführt, und bis zu diesem Zeitpunkt ist kein Cookie vorhanden, um die Authentifizierung zu überprüfen, sodass er erneut an Google weitergeleitet wird. Versuchen Sie, 'setTimeout' oder etwas zu verwenden, um die Authentifizierungsprüfung nach einer Sekunde oder so auszuführen, um sicher zu sein. – Anurag

+0

@Annurag - post, dass als Antwort und Sie könnten einige Rep erhalten. Ich würde es für dich tun, aber das wäre Stehlen :) – Day

+0

danke für den Tipp @Day .. Ideen für mehr rep immer willkommen :) – Anurag

Antwort

1

Das Problem besteht darin, dass das Setzen des Cookies eine Weile dauert, wenn Google auf Ihre Website weiterleitet. Der Rückruf wird jedoch sofort ausgeführt, und bis zu diesem Zeitpunkt ist kein Cookie vorhanden, um die Authentifizierung zu überprüfen, sodass er erneut an Google weitergeleitet wird. Versuchen Sie, setTimeout oder etwas zu verwenden, um die Authentifizierungsprüfung nach einer Sekunde oder so auszuführen, um sicher zu sein.

0

Sie sollten den Gültigkeitsbereich auch an die Login-Methode übergeben.

0

Manchmal können Sie mit einem orphaned Cookie in Ihrem Browser enden - der immer wieder an Google weitergeleitet wird.

Was ich jetzt mache, macht eine CheckLogin, bevor ich meinen Login-Aufruf ausführen, und wenn es wahr zurückgibt, rufe ich explizit logOut().

Der logOut-Aufruf entfernt alle Cookies, die Google abgelehnt, aber in Ihrem Browser hinterlassen hat. Der Grund, warum es in einer Schleife weiter zu laufen scheint, ist, dass der Cookie da ist, aber selbst auf Neuem erzeugt er keinen neuen, weil Sie bereits einen haben. Aber leider für uns ist der, der da ist, ungültig.

2

ich das gleiche Problem hatte, damit ich diese Funktion gebaut

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

ich den Scheck google.accounts.user.getStatus() hinzugefügt, wenn es 1 ist das bedeutet, dass die Anwendung in den Prozess der Protokollierung ist in und wenn es 2 ist, bedeutet dies, dass die Anwendungen angemeldet sind. Sie können auch einen Bereich an die Methode "getStatus" übergeben.