2014-01-06 2 views
3

Я столкнулся с нечетной проблемой с сервисом ngCookies. В основном, после получения ответа от моего /api/auth/login/ конечной точки, с заголовками:Обновление cookie от ответа, отложенного в будущем

Set-Cookie csrftoken=gxCld8gEga71MuQPQbjDujDBvR4HwPvu; expires=Sun, 28-Dec-2014 15:31:38 GMT; Max-Age=31449600; Path=/ 

$cookies['csrftoken'] обновляется после неопределенного периода времени. Этот факт был задокументирован в docs:

Only a simple Object is exposed and by adding or removing properties to/from this object, new cookies are created/deleted at the end of current $eval. 

Зная, что я прибегал к использованию $timeout, мы надеемся задержать оценку моего кода к после вышеупомянутая $eval.

Законченное со следующим (CoffeeScript):

login =() -> 
    deferred = $q.defer() 

    $http.post('/api/accounts/login/', data) 
    .success((data) -> 
     args = arguments 
     $timeout(() -> 
      do_fancy_stuff() 
      deferred.resolve.apply(deferred, args) 
     ) 
     return 
    ).error(() -> 
     args = arguments 
     $timeout(() -> 
      deferred.reject.apply(deferred, args) 
     ) 
     return 
    ) 

    promise = deferred.promise 
    promise.success = promise.then 
    promise.error = promise.catch 
    promise 

Но код выше по-прежнему страдает от проблемы. Куки обновляется значением от пути реакции после $timeout пинков в.

После добавления console.log('cookies push', $browser.cookies().csrftoken, cookies.csrftoken);here (после if заявления). Я в конечном итоге с чем-то вроде этого:

enter image description here

Как вы можете видеть, маркеры были равны после 7 гравюр.

Маркировка yhQqT6KOfSKYCNB3Ag4sEPllMgkLrVj1 относится к предыдущей сессии. Я тестирую вход в приложение и не обновляю страницу. Setting X-CSRFToken вызывается непосредственно в моей функции do_fancy_stuff() (нет асинхронных вещей, только голый $cookies['csrftoken'] доступ).

Кроме того, использование $q требуется обеспечить $http -как перспективны в качестве возвращаемого значения (там не было бы, если $q печенье работают нормально).

+0

Я думаю, что испытываю подобную проблему. Любой прогресс в разрешении? –

+0

@SethM., Я действительно сделал это так, чтобы мои представления 'login' вернули заголовок X-CSRFToken со значением токена. При этом в ответе на предстоящие запросы можно напрямую настроить заголовок '$ http' по умолчанию. Заметьте, что я утверждаю, что это взлом, а не решение. –

ответ

4

Решение, которое я выбрал для использования на основе найденной информации here и here. Сообщает мне, что $ cookie попытается обновить каждые 100 мс. Поэтому с учетом этой информации вы можете добавить $ timeout к любому запросу, который должен использовать куки ответов.

 $http.post(url, tokens) 
      .success(function(result, status, headers, config) { // sign in successful 
       $timeout(function() { /* do stuff with $cookies here. */ }, 100); 
      }) 
      .error(function(data, status, headers, config) { 
      }); 
+0

Я пробовал 40 мс, он отлично работает. Вы можете это объяснить? – bpceee

Смежные вопросы