@@ -431,8 +431,8 @@ AngularFire.prototype = {
431431// Defines the `$firebaseAuth` service that provides authentication support
432432// for AngularFire.
433433angular . module ( "firebase" ) . factory ( "$firebaseAuth" , [
434- "$timeout" , "$injector" , "$rootScope" , "$location" ,
435- function ( $t , $i , $rs , $l ) {
434+ "$q" , "$ timeout", "$injector" , "$rootScope" , "$location" ,
435+ function ( $q , $ t, $i , $rs , $l ) {
436436 // The factory returns an object containing the authentication state
437437 // of the current user. This service takes 2 arguments:
438438 //
@@ -460,13 +460,14 @@ angular.module("firebase").factory("$firebaseAuth", [
460460 // The returned object will also have the following methods available:
461461 // $login(), $logout() and $createUser().
462462 return function ( ref , options ) {
463- var auth = new AngularFireAuth ( $t , $i , $rs , $l , ref , options ) ;
463+ var auth = new AngularFireAuth ( $q , $ t, $i , $rs , $l , ref , options ) ;
464464 return auth . construct ( ) ;
465465 } ;
466466 }
467467] ) ;
468468
469- AngularFireAuth = function ( $t , $i , $rs , $l , ref , options ) {
469+ AngularFireAuth = function ( $q , $t , $i , $rs , $l , ref , options ) {
470+ this . _q = $q ;
470471 this . _timeout = $t ;
471472 this . _injector = $i ;
472473 this . _location = $l ;
@@ -534,8 +535,16 @@ AngularFireAuth.prototype = {
534535 var client = new FirebaseSimpleLogin ( self . _fRef , function ( err , user ) {
535536 self . _cb ( err , user ) ;
536537 if ( err ) {
538+ if ( self . _deferred ) {
539+ self . _deferred . reject ( err ) ;
540+ self . _deferred = null ;
541+ }
537542 self . _rootScope . $broadcast ( "$firebaseAuth:error" , err ) ;
538543 } else if ( user ) {
544+ if ( self . _deferred ) {
545+ self . _deferred . resolve ( user ) ;
546+ self . _deferred = null ;
547+ }
539548 self . _loggedIn ( user ) ;
540549 } else {
541550 self . _loggedOut ( ) ;
@@ -548,9 +557,12 @@ AngularFireAuth.prototype = {
548557
549558 // The login method takes a provider (for Simple Login) or a token
550559 // (for Custom Login) and authenticates the Firebase URL with which
551- // the service was initialized.
560+ // the service was initialized. This method returns a promise, which will
561+ // be resolved when the login succeeds (and rejected when an error occurs).
552562 login : function ( tokenOrProvider , options ) {
553563 var self = this ;
564+ var deferred = self . _q . defer ( ) ;
565+
554566 switch ( tokenOrProvider ) {
555567 case "github" :
556568 case "persona" :
@@ -560,8 +572,10 @@ AngularFireAuth.prototype = {
560572 case "anonymous" :
561573 if ( ! self . _authClient ) {
562574 var err = new Error ( "Simple Login not initialized" ) ;
575+ deferred . reject ( err ) ;
563576 self . _rootScope . $broadcast ( "$firebaseAuth:error" , err ) ;
564577 } else {
578+ self . _deferred = deferred ;
565579 self . _authClient . login ( tokenOrProvider , options ) ;
566580 }
567581 break ;
@@ -572,15 +586,20 @@ AngularFireAuth.prototype = {
572586 var claims = self . _deconstructJWT ( tokenOrProvider ) ;
573587 self . _fRef . auth ( tokenOrProvider , function ( err ) {
574588 if ( err ) {
589+ deferred . reject ( err ) ;
575590 self . _rootScope . $broadcast ( "$firebaseAuth:error" , err ) ;
576591 } else {
592+ self . _deferred = deferred ;
577593 self . _loggedIn ( claims ) ;
578594 }
579595 } ) ;
580596 } catch ( e ) {
597+ deferred . reject ( e ) ;
581598 self . _rootScope . $broadcast ( "$firebaseAuth:error" , e ) ;
582599 }
583600 }
601+
602+ return deferred . promise ;
584603 } ,
585604
586605 // Unauthenticate the Firebase reference.
0 commit comments