2017-03-18 20 views
0

私はIonic FrameworkとFirebaseでアプリをやっています。 Firebaseの内部でデータを取得するためにカスタムログインを行いましたが、アプリが再起動されるたびに再度ログインする必要があります。どうすればログインを維持できますか?ユーザーは最初にログインする必要があり、もう一度行う必要はありません。私はこれを行う方法をFirebaseログインを維持する方法は?

(function() { 
 
\t 'use strict'; 
 

 
    angular 
 
     .module('mytodo.login') 
 
     .factory('LoginService', LoginService); 
 

 
    LoginService.$inject = ['$state', '$ionicLoading', '$firebaseAuth', '$firebaseObject','$rootScope', '$timeout', 'fb', '$q']; 
 

 
    function LoginService($state, $ionicLoading, $firebaseAuth, $firebaseObject, $rootScope, $timeout, fb, $q){ 
 
     
 

 
     var service = { 
 
      CustomLogin: CustomLogin, 
 
      GetCurrentUser: GetCurrentUser, 
 
      RegisterUser: RegisterUser, 
 
     }; 
 
     return service; 
 

 
     function CustomLogin(email, password) { 
 
      if(email ==null | password == null){ 
 
       console.log('Preencha todos os campos!'); 
 
       return; 
 
      } 
 

 
      $ionicLoading.show({ 
 
       showBackdrop: false, 
 
       template: '<p>Carregando...</p><ion-spinner icon="android" style="stroke: #1d9c9e;fill:#1d9c9e;"></ion-spinner>' 
 
      }); 
 

 
      $firebaseAuth().$signInWithEmailAndPassword(email, password).then(function(authData) { 
 
       $rootScope.currentUser = GetCurrentUser(authData.uid); 
 

 
       $timeout(function() { 
 
        $ionicLoading.hide(); 
 
        $state.go('tab.todo', {}); 
 
       }, 1000); 
 

 
      }).catch(function(error) { 
 
       showToast(); 
 
       
 
       $ionicLoading.hide(); 
 
       
 
       console.log(error); 
 
      }); 
 
     } 
 

 
     function showToast(){ 
 
      ionicToast.show('Usuário ou senha inválido', 'middle', false, 1500); 
 
     } 
 

 

 
     function GetCurrentUser(userId) { 
 
      var query = fb.child('/users/' + userId); 
 
      var currentUser = $firebaseObject(query) 
 
      return currentUser; 
 
     } 
 

 
     function SaveUser(authData) { 
 

 
      console.log(authData.uid); 
 
      var deffered = $q.defer(); 
 
      
 
      var uid = authData.uid; 
 
      var user = { 
 
       displayName: authData.displayName, 
 
       name: authData.displayName, 
 
       photoURL: authData.photoURL, 
 
       email: authData.email, 
 
       emailVerified: authData.emailVerified, 
 
       providerId: authData.providerData[0].providerId 
 
      }; 
 

 
      var ref = fb.child('/users/' + uid); 
 
      ref.once("value") 
 
       .then(function(snapshot) { 
 
        if (snapshot.exists()) { 
 
         console.log('User already exists'); 
 
        } else { 
 
         ref.set(user); 
 
        } 
 

 
        deffered.resolve(snapshot); 
 
       }); 
 

 
      return deffered.promise; 
 
     }; 
 

 
     function RegisterUser(user) { 
 
      var deffered = $q.defer(); 
 
      $ionicLoading.show(); 
 
      $firebaseAuth().$createUserWithEmailAndPassword(user.email, user.password).then(function(authData) { 
 
       var newUser = { 
 
        name: user.name, 
 
        email: user.email, 
 
        providerId: authData.providerData[0].providerId 
 
       }; 
 

 
       var userId = authData.uid; 
 
       var ref = fb.child('/users/' + userId); 
 
       ref.once("value") 
 
        .then(function(snapshot) { 
 
         if (snapshot.exists()) { 
 
          //console.log('User already exists'); 
 
         } else { 
 
          ref.set(newUser).then(function(user){ 
 
           $rootScope.currentUser = GetCurrentUser(userId); 
 
          }) 
 
         } 
 

 
         deffered.resolve(snapshot); 
 
         CustomLogin(user.email, user.password); 
 
        }); 
 
      }).catch(function(error) { 
 
       $ionicLoading.hide(); 
 
       var errorCode = error.code; 
 
       console.log(errorCode); 
 

 
       if(errorCode === 'auth/weak-password') 
 
        ionicToast.show('Erro, a senha precisa ter no mínimo 6 digitos.', 'middle', false, 3000); 
 
       
 
       if(errorCode === 'auth/email-already-in-use') 
 
        ionicToast.show('Erro, o email: ' + user.email + ' já existe em nossa base de dados.', 'middle', false, 3000); 
 
      }) 
 

 
      return deffered.promise; 
 
     }; 
 
    } 
 
})();

答えて

0

を考え出した:

は、ここに私のサービスです。たぶんそれはそれのための最も正確なanwserではないが、それは私のために働いた。私はlocalSotrageを使ってユーザ名とパスワードを保存しました。私はまた、tolkenを格納することができますが、私は "パスワードを覚えて"画面を作成したい。 初めてログインするときは、私のサービスでこれを行います。

service.js私はユーザーデータを保存します。 私のコントローラに次のif文を追加します。すでにログインしている場合は、電子メールとパスワードを使用して再度ログインします。私がいないと、私はユーザーがボタンを押して私のサービスで機能を呼び出すのを待つ。

controller.js if文:

if(localStorage.getItem("uEmail")!==undefined && localStorage.getItem("uPassword")!==undefined) { 
 
    LoginService.CustomLogin(localStorage.getItem("uEmail"),localStorage.getItem("uPassword")) 
 
}

1

あなたは、その後、少なくともハッシュとしてパスワードを保存する必要がある場合は、ストレージにユーザー名とパスワードを持続してはいけません。

Firebaseが再度ログインするために、次があります firebase.auth()onAuthStateChanged(ユーザー=> {

を})。

1

ログインを永続させないようにするには、firebaseがこれを行います。私はFYIのtypescriptからこれを参照しています。公式ドキュメント()で

:ディスク上にあるローカル

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL) 

その後、コードでは、onAuthStateChangedオブザーバブルを購読するだけです。

this.firebase.auth.onAuthStateChanged(user => { 
    if (user){ 

プレーンテキストのパスワードを自分で保存しないでください。 Firebaseは、UID、セッションAPIキーなどのユーザを維持します。

Firebaseのドキュメントに従ってください。プレーンテキストのパスワードを保持すると、セキュリティ監査が正しく行われません。

関連する問題