2

firebase と angularjs をいじって、ちょっとしたことをまとめてみました。サインインボタンのクリックで呼び出されるこの関数を使用して、コントローラーで認証が機能するようになりました。

$scope.signin = function(){
        var user1 = $scope.cred.user;
        var pass1 = $scope.cred.password;

        var ref = new Firebase("https://kingpinapp.firebaseio.com");
        var auth = new FirebaseAuthClient(ref, function(error, user) {
            if (user) {
                // user authenticated with Firebase
                console.log(user);


            } else if (error) {
                 // an error occurred authenticating the user
                 console.log(error);

                } else {
                // user is logged out
            }   
        });
        auth.login('password', {
            email: user1,
            password: pass1,
            rememberMe: false
        });
        console.log("tracer");
}

今、これは素晴らしく、うまく機能します。しかし、非同期で動作しているようです。たとえば、auth.login のユーザー オブジェクトの前に console.log("tracer") が返されます。これを行うには、おそらく約束を扱う必要があることを知っており、次のことを試しました。

var defer = $q.defer();
defer.auth
.then(function() {
    auth.login('password', {
        email: user1,
        password: pass1,
        rememberMe: false
    });
})
.then(function() {
    console.log("tracer");
})

しかし、コントローラーモジュールで宣言した後、 $q is not defined を受け取りました。だから私がやろうとしていることは

  1. ユーザーがログインしているかどうかを確認します。
  2. はい/いいえを受け取るまで待ちます
  3. ログインしていない場合は、auth.login を使用します
  4. 他のユーザー ログインしているユーザーは、他のことを行います

auth.login 関数を変数 auth の else に入れることを考えましたが、うまくいかないようです。これを機能させる方法を理解する上で、適切なロジックを理解しようとしています。

4

3 に答える 3

6

コントローラーごとに FirebaseAuthClient を設定する必要はありませんが、ユーザーの認証状態が変化したときにすべてのコントローラーにアラートを送信する必要があります。

FirebaseAuthClientセッション ストレージを処理します。ユーザーが正常にサインインしたら、サインイン画面/ボタンを非表示にするだけです。

次のようなことを試してください:

.service('myAuthService', ["$rootScope", function($rootScope) {
    var ref = new Firebase("https://kingpinapp.firebaseio.com");
    this.auth = new FirebaseAuthClient(ref, function(error, user) {
        if (user) {
            $rootScope.$emit("login", user);
        }
        else if (error) {
            $rootScope.$emit("loginError", error);
        }
        else {
            $rootScope.$emit("logout");
        }   
    });
}])
.controller('myCtrl', ["$scope", "$rootScope", "myAuthService", function($scope, $rootScope, myAuthService) {
    $scope.signin = function() {
        var user1 = $scope.cred.user;
        var pass1 = $scope.cred.password;

        myAuthService.auth.login('password', {
            email: user1,
            password: pass1,
            rememberMe: false
        });
    }
    // listen for user auth events
    $rootScope.$on("login", function(event, user) {
        // do login things
        $scope.user = user;
    })
    $rootScope.$on("loginError", function(event, error) {
        // tell the user about the error
    })
    $rootScope.$on("logout", function(event) {
        // do logout things
    })
}])
<button ng-show="user" ng-click="signin()">Sign in</button>
于 2013-05-10T19:35:10.297 に答える
2

コントローラーに $q を依存関係として含めていることを確認してください。単純なケースでは:

function MyController($scope, $q, angularFire) {
  $scope.signin = ...
}

または、「適切な」モジュール構文を使用している場合:

angular.module("MyModule", ["firebase"]).
controller("MyController", ["$scope", "$q", "angularFire", function($scope, $q, aF) {
  $scope.signin = ...
}]);

angular 依存性注入の詳細については、http: //docs.angularjs.org/guide/di を参照してください。遅延を使用した Firebase 認証の例については、https ://gist.github.com/sbrekken/5151751 を参照してください。

于 2013-05-07T21:57:04.643 に答える
0

この質問への回答を既にここに投稿しましたFACTORY: get current user.id for Firebase Simple Login (Email / Password)

これは、この問題に対するかなり堅実な解決策であり、まさにあなたが探しているものかもしれません。

于 2013-07-06T02:29:26.093 に答える