AngularFire Infinite $digest Loop с методом перенаправления браузера OAuth

Я пытаюсь настроить вход в AngularFire с потоком OAuth на основе перенаправления в моем веб-приложении AngularJS с бэкэндом FireBase. Я использую AngularJS 1.3.14, Firebase 2.2.3 и AngularFire 1.0.0.

Я попытался настроить базовый пример, чтобы выполнить аутентификацию самым простым способом, следуя документам библиотеки AngularFire: https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-users-and-authentication

Я завершил настройку аутентификации приложения Google, как описано здесь: https://www.firebase.com/docs/web/guide/login/google.html

В моем контроллере я делаю:

    var ref = new Firebase("https://xxxxxxx.firebaseio.com");
    $scope.authObj = $firebaseAuth(ref);

а затем следующая процедура привязана к кнопке «Вход» в моем интерфейсе.

    $scope.authObj.$authWithOAuthRedirect("google");

Как только я нажимаю кнопку «Войти», меня перенаправляют в Google, где я могу авторизовать свое приложение и войти в свою учетную запись. Затем меня перенаправляют обратно в мое приложение, но я вижу эту ошибку в консоли браузера javascript (Chrome):

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.14/$rootScope/infdig?p0=10&p1=%5B%5D
    at REGEX_STRING_REGEXP (angular.js:63)
    at Scope.$get.Scope.$digest (angular.js:14281)
    at Scope.$get.Scope.$apply (angular.js:14506)
    at bootstrapApply (angular.js:1448)
    at Object.invoke (angular.js:4185)
    at doBootstrap (angular.js:1446)
    at bootstrap (angular.js:1466)
    at angularInit (angular.js:1360)
    at angular.js:26176
    at HTMLDocument.trigger (angular.js:2744)

Я не могу понять, почему это происходит и как решить. Похоже, что во время начальной загрузки AngularJS происходит какой-то цикл.

Если я заменю свою строку $scope.authObj.$authWithOAuthRedirect("google"); вызовом $authWithOAuthPopup (точный код см. ниже), все будет работать нормально:

$scope.authObj.$authWithOAuthPopup("google")
    .then(function(authData) {
        $log.info("Logged in as:", authData.uid);
    }).catch(function(error) {
        $log.info("Authentication failed:", error);
    });

С этим кодом, привязанным к моей кнопке «Войти», появляется всплывающее окно, позволяющее мне войти в систему с помощью Google, а затем я могу прочитать ожидаемое сообщение авторизации в консоли: Logged in as: google:[undisclosed-21-digit-number].

Любая помощь, чтобы лучше понять библиотеку аутентификации AngularFire, будет принята с благодарностью. Заранее спасибо.


person Mettiu    schedule 06.04.2015    source источник
comment
Если я попробую фрагмент из документации Firebase здесь firebase.com /docs/web/guide/user-auth.html#section-popups в Chrome для iOS (который не поддерживает всплывающие окна) я получаю бесконечный цикл, как описано здесь: stackoverflow.com/questions/27927200/. Но в моем случае у меня нет бесконечного перенаправления, потому что я привязал авторизацию к кнопке просмотра. На данный момент я имею дело с циклом дайджеста AngularJS.   -  person Mettiu    schedule 06.04.2015


Ответы (1)


Я нашел решение/обходной путь. На самом деле, я думаю, что вызов $authWithOAuthRedirect из библиотеки angularfire делает что-то, чего я не могу понять. Я пробовал с «ванильной» библиотекой Firebase (с той же структурой приложения), и все в порядке. Чтобы заставить его работать, я следовал инструкциям из их документов здесь: https://www.firebase.com/docs/web/guide/user-auth.html#section-login и ref.authWithOAuthRedirect("<provider>", authHandler); работает как положено, без перенаправлений и циклов дайджеста.

Мне все еще интересно, почему библиотека AngularFire не работает, но я решил проблему.

Надеюсь это поможет.

person Mettiu    schedule 12.04.2015