如何保持 Firebase 登录?

Posted

技术标签:

【中文标题】如何保持 Firebase 登录?【英文标题】:How to persist a Firebase login? 【发布时间】:2017-08-10 05:32:01 【问题描述】:

我正在使用 Ionic Framework 和 Firebase 制作应用程序。我进行了自定义登录以在 Firebase 中获取数据,但每次重新启动应用程序时,我都需要再次登录。如何保持登录?用户应该是第一次登录,不需要再次登录。

这是我的服务:

(function() 
	'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;
        ;
    
)();

【问题讨论】:

【参考方案1】:

较新的版本:

像这样初始化应用程序,即使在同一设备上关闭并重新打开浏览器后,用户也能保持登录状态。

import  initializeApp  from 'firebase/app';
import  getAuth, browserLocalPersistence, setPersistence  from 'firebase/auth'

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
(async () => 
    await setPersistence(auth, browserLocalPersistence);
)();

要获取用户对象,您可以使用React Firebase Hooks:

import  useAuthState  from 'react-firebase-hooks/auth';

const [user, loading, error] = useAuthState(auth);

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

要重申不要自己坚持登录的观点,firebase 会为您执行此操作。我从 typescript FYI 中引用这个。

在官方文档()中:

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

local 在磁盘上的位置。

然后在您的代码中,您需要做的就是订阅 onAuthStateChanged observable。

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

不要自己保留纯文本密码!!!! Firebase 为用户保留 uid、会话 API 密钥等。

只需遵循 Firebase 文档即可。保留纯文本密码会导致安全审计失败。

【讨论】:

我使用了 firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL) 但是在刷新时没有任何保留【参考方案3】:

如果您必须至少将密码存储为哈希值,则不应将用户名和密码保存到存储中。

Firebase 具有以下用于再次登录的功能: firebase.auth().onAuthStateChanged(user =>

);

【讨论】:

【参考方案4】:

我已经想出了如何做到这一点。也许它不是最正确的答案,但它对我有用。我使用 localSotrage 来存储用户名和密码。我也可以存储 tolken,但我想创建一个“记住密码”屏幕。 当我第一次登录时,我会在我的服务中执行此操作。

service.js 当我存储用户数据时;

localStorage.setItem("uPassword",password);
localStorage.setItem("uEmail",email);
我在控制器中添加了以下 if 语句。如果我已经登录,我会使用电子邮件和密码再次登录。如果我不这样做,我会等待用户按下按钮并在我的服务中调用 de 函数。

controller.js if 语句:

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

【讨论】:

这是一种不好的做法,如果您将未经过哈希处理的用户凭据存储在本地存储中,这会使开发人员看起来很糟糕。我不会使用你的应用程序。 @mbejda 我完全同意你的观点,这是三年前我开始编码的时候。我为我一开始所做的事情感到羞愧,我不建议任何人这样做或使用这个应用程序(PS:这个应用程序不是,从来没有,也永远不会投入生产) @LucasGaspar 你可以做的是将接受的答案更改为@Christo Goosen's

以上是关于如何保持 Firebase 登录?的主要内容,如果未能解决你的问题,请参考以下文章

刷新后如何让用户保持登录到 Firebase 应用程序?

在 React.JS 中刷新后,如何让用户保持登录到 firebase?

Firebase Unity 插件:如何保持用户会话? (自动登录)

即使关闭应用程序,如何保持用户登录?我正在使用 swift 3 和 Firebase

我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?

如何使用 Firebase 刷新令牌保持用户身份验证?