2010-05-06 2 views
5

Я использую JavaScript API данных Google и имею проблемы с тем, чтобы сценарий AuthSub работал правильно. Это мой сценарий в настоящее время:Gdata JavaScript Authsub продолжает перенаправление

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

Однако при запуске страницы страница перенаправляет меня на страницу аутентификации. После того, как я аутентифицирую его, отправьте меня на мою страницу, а затем снова вернет меня на страницу аутентификации. Я включил оповещения, чтобы проверить, установлен ли токен, и он, похоже, не работает. У кого-нибудь есть эта проблема?

+2

проблема в том, что настройка файла cookie занимает некоторое время, когда Google перенаправляет обратно на ваш сайт. Тем не менее, обратный вызов запускается немедленно, и к этому моменту нет cookie для проверки подлинности, поэтому он снова перенаправляет обратно в google. Попробуйте использовать 'setTimeout' или что-то, чтобы запустить проверку подлинности через секунду или около того, чтобы быть уверенным. – Anurag

+0

@Anurag - опубликуйте это как ответ, и вы можете получить репутацию. Я бы сделал это за вас, но это было бы краже :) – Day

+0

спасибо за отзыв @Day .. идеи для большего количества rep всегда приветствуются :) – Anurag

ответ

1

проблема заключается в том, что настройка файла cookie занимает некоторое время, когда Google перенаправляет обратно на ваш сайт. Тем не менее, обратный вызов запускается немедленно, и к этому моменту нет cookie для проверки подлинности, поэтому он снова перенаправляет обратно в google. Попробуйте использовать setTimeout или что-то, чтобы запустить проверку подлинности через секунду или около того, чтобы быть уверенным.

0

Вы также должны передать область действия для входа в систему.

0

Иногда в вашем браузере может появиться файл cookie orphaned, который будет постоянно возвращаться в Google.

Что я делаю сейчас, делает checkLogin, прежде чем выполнять свой логин, и если он возвращает true, я прямо вызываю logOut().

Звонок logOut удалит любые файлы cookie, которые Google отклонил, но оставил в вашем браузере. Причина, по которой он, кажется, продолжает идти в цикле, состоит в том, что файл cookie существует, но даже на reauth он не создает новый, потому что у вас его уже есть. Но, к сожалению, ради нас, тот, что там, недействителен.

2

У меня была та же проблема, так что я построил эту функцию

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

я добавил чек google.accounts.user.getStatus(), если он равен 1, что означает, что приложение находится в процессе лесозаготовок в и если это 2, это означает, что приложения вошли в систему. Вы также можете передать область действия методу getStatus.