createUser and login flow with promises

2019-05-31 01:25发布

问题:

In this git issue AngularFire disabled the auto-login functionality associated with $createUser. (The docs are outdated.)

So what's the best practice / cleanest way to create a user and then log them in?

 app.factory('Auth', function($firebaseSimpleLogin, FIREBASE_URL, $rootScope) { 
    var ref = new Firebase(FIREBASE_URL);
    var auth = $firebaseSimpleLogin(ref);

    var Auth = {
        register: function (user) {
            return auth.$createUser(user.email, user.password);
        },
        login: function (user) {
            return auth.$login('password', user);
        },
        ...

Note: $createUser returns a md5 hash but $login uses plaintext password.

I'm new to promises. Thanks!

回答1:

I didn't realize what Kato meant. But now that I understand promises the solution is pretty straight forward:

    register: function (user) {
        return auth.$createUser(user.email, user.password)
            .then(function() {
                return auth.$login('password', user);
            });
    },


回答2:

I think this should do it. You have to use q or inject angular.$q.

app.factory('Auth', function($firebaseSimpleLogin, FIREBASE_URL, $rootScope) { 
var ref = new Firebase(FIREBASE_URL);
var auth = $firebaseSimpleLogin(ref);
var deferred = Q.defer(); // from Q lib
// var deferred = $q.defer(); //angularjs q

var Auth = {
    register: function (user) {

        auth.$createUser(user.email, user.password)
        .then(function(result) {
          deferred.notify('user created.'); // optional notify progress
          return auth.$login('password', user); // return a new promise for chaining.
        },
        function(reason) {
          // createUser failed
          deferred.reject(reason);
        })
        .then(function(result) {
          // resolve the login promise return from above
          deferred.resolve(result);
        },
        function(reason) {
          // login failed
          deferred.reject(reason);
        });

        return deferred;
    },
    login: function (user) {
        return auth.$login('password', user);
    },
    ...