加载视图& AUTH_REQUIRED错误和路由解析后的控制器被拒绝

时间:2015-09-03 12:49:21

标签: angularjs authentication firebase firebase-authentication

在AngularJS(我是新手)中,我如何“解决”在路由期间被拒绝的承诺?

我的应用要求所有访问者匿名或通过指定其凭据进行身份验证 - 我正在使用Firebase和AngularFire。

最初,当访问者导航到route时,我会使用resolve检查他们是否在路由期间使用$routeProvider进行了身份验证。

如果访问者未经过身份验证(error === 'AUTH_REQUIRED'),则拒绝承诺。然后我匿名验证用户。

由于承诺被拒绝,路线的controllerview未加载。

问:在我对访问者进行匿名身份验证后,如何加载路由controllerview

我想我可以以某种方式刷新/重新加载路线,但我也想象有更好的方法。

因此,对于导航到需要身份验证的路由的未经身份验证的用户(几乎所有人都会):

  1. 需要验证;拒绝承诺
  2. 匿名验证访客
  3. 匿名身份验证成功;如果访问者已经过身份验证,则加载路由的controllerview(以及其他任何内容)
  4. 据我了解,我无法解决已被拒绝的承诺。

    我希望你能帮忙;以下是我目前正在尝试实现此目标的示例:

    var app = angular.module('vo2App', ['firebase', 'ngRoute']);
    
    app.config(['$routeProvider', function ($routeProvider) {
      $routeProvider
      .when('/', {
        controller: 'HomeCtrl',
        resolve: {
          'currentAuth': ['Auth', function (Auth) {
            return Auth.$requireAuth();
          }]
        },
        templateUrl: './views/home.html'
      })
    }]);
    
    app.run(['$rootScope', 'Auth', function ($rootScope, Auth) {
      $rootScope.$on('$routeChangeError', function (event, next, prev, error) {
        if (error === 'AUTH_REQUIRED') {
          console.log('Unauthorized');
    
          Auth.$authAnonymously().then(function (authData) {
            console.log(authData);
          }).catch(function(error) {
            console.log(error);
          });
        }
      });
    }]);
    
    app.controller('HomeCtrl', ['currentAuth', function (currentAuth) {
      console.log(currentAuth);
    }]);
    
    app.factory('Auth', ['$firebaseAuth', function ($firebaseAuth) {
      var ref = new Firebase('https://myvo2-mx.firebaseio.com');
    
      return $firebaseAuth(ref);
    }]);
    

1 个答案:

答案 0 :(得分:1)

为什么不Auth.$requireAuth();调用Auth.$authAnonymously()以便只有在两者都失败时才能拒绝承诺。

基本上,

var defer = $q.defer();
Auth.$requireAuth().then(defer.resolve,function(){
   Auth.$authAnonymously().then(defer.resolve,defer.reject)
})
return defer.promise;