记住Ionic Firebase应用中的用户

时间:2016-12-30 18:45:46

标签: android angularjs authentication firebase ionic-framework

我正在使用Firebase作为后端编写Ionic应用程序,并且正在努力让用户登录。 我目前只在Android上测试过。

当应用启动时,我使用firebase.auth().signInWithEmailAndPassword

登录用户

登录后,如果用户多次按下物理后退按钮关闭应用程序,然后他们再次启动应用程序,他们必须再次登录,因为应用程序丢失了凭据(firebase.auth().currentUser是空的。

我希望应用在用户登录时记住设备上的用户,并且只有在他们专门点击应用退出按钮时才会将其注销。

这是我app.js中的代码

angular.module('starter', [
    'ionic',
    'firebase',
    'starter.loginController',
    'starter.resetemailController',
    'starter.signupController',
    'starter.dashboardController',
    'starter.sidebarController'
])

.run(function ($ionicPlatform, $rootScope, $state, CONFIG) {
    $ionicPlatform.ready(function () {
        if (window.cordova && window.cordova.plugins.Keyboard) {
            // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
            // for form inputs)
            // Don't remove this line unless you know what you are doing. It stops the viewport
            // from snapping when text inputs are focused. Ionic handles this internally for
            // a much nicer keyboard experience.
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
            cordova.plugins.Keyboard.disableScroll(true);
        }
        if (window.StatusBar) {
            StatusBar.styleDefault();
        }
    });

    // on stateChange event if state requires authentication and user not logged in, go to login state
    $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
        var user = firebase.auth().currentUser;
        if (toState.authRequired && !user) {
            $state.go("login");
            event.preventDefault();
        }
    });

    // initialise firebase
    firebase.initializeApp({
        apiKey: 'xxxxxxxxx',
        authDomain: 'xxxxxxx.firebaseapp.com',
        databaseURL: 'https://xxxxxx.firebaseio.com',
        storageBucket: 'xxxxxxxxxx.appspot.com',
        messagingSenderId: 'xxxxxxxxxxxxxx'
    });

})

.config(['$stateProvider', '$urlRouterProvider', '$ionicConfigProvider', function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

    $ionicConfigProvider.navBar.alignTitle('center');

    $stateProvider

    .state('app', {
        url: '/app',
        abstract: true,
        templateUrl: 'shared/sidebar/sidebarView.html',
        controller: 'sidebarController'
    })

    .state('app.dashboard', {
        url: '/dashboard',
        views: {
            'menuContent': {
                templateUrl: "components/dashboard/dashboardView.html",
                controller: "dashboardController"
            }
        },
        authRequired: true
    })

    .state('login', {
        cache: false,
        url: '/login',
        templateUrl: "components/login/loginView.html",
        controller: "loginController"
    })

    .state('signup', {
        url: '/signup',
        templateUrl: "components/signup/signupView.html",
        controller: "signupController"
    })

    .state('reset', {
        url: '/reset',
        templateUrl: "components/resetemail/resetemailView.html",
        controller: "resetemailController"
    })

    // this is a workaround to prevent the $stateChangeStart firing multiple times
    $urlRouterProvider.otherwise(function ($injector) {
        var $state = $injector.get('$state');
        $state.go('app.dashboard');
    });

}])

当用户登录时,$urlRouterProvider.otherwise会将应用转到信息中心作为初始状态。

如果用户为空,则以下代码重新路由到登录状态

$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
    var user = firebase.auth().currentUser;
    if (toState.authRequired && !user) {
        $state.go("login");
        event.preventDefault();
    }
});

这一切都很好,但是一旦用户关闭应用程序,我希望应用程序记住用户,以便下次启动时,他们将直接进入仪表板状态而不必每次都登录。

我不会在用户登录时存储任何内容 - 我是否需要在本地存储中存储某些凭据?

我已经阅读过有关JWT的内容,但我并不完全了解如何创建或使用它们。

我已经看到一些帖子提及firebase.auth().currentUser.getToken(true)但又一次,我不知道如何处理它 - 我需要在登录后的某个地方存储此令牌吗?

对不起,如果这有点模糊;我现在真的很陌生,而且现在很多都是我的头脑。

0 个答案:

没有答案