我正在使用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)
但又一次,我不知道如何处理它 - 我需要在登录后的某个地方存储此令牌吗?
对不起,如果这有点模糊;我现在真的很陌生,而且现在很多都是我的头脑。