2015-01-12 13 views
17

Tôi đang xây dựng một ứng dụng trong Ionic và đã bắt đầu tìm hiểu phương pháp xác thực Firebase. Cho đến nay tôi đã quản lý để thiết lập một đăng nhập thông qua Twitter đúng cách (tôi có thể đăng nhập và đăng xuất).Làm cách nào để xử lý các trạng thái khi đăng nhập (Ionic, Firebase, AngularJS)?

Tuy nhiên, làm thế nào để thiết lập trạng thái của khuôn khổ ion như vậy mà chỉ các quốc gia cụ thể (và do đó trang) được hiển thị khi đăng nhập và những người khác khi đăng xuất khỏi? Mã tôi có cho đến nay được hiển thị dưới đây.

Lý tưởng nhất là tôi sẽ có một cái gì đó giống như một biến:

AuthRequired: true 

Làm thế nào để bạn làm điều này và những gì nó được gọi là?

app.js

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
// the 2nd parameter is an array of 'requires' 
// 'starter.services' is found in services.js 
// 'starter.controllers' is found in controllers.js 
angular.module('starter', ['ionic', 'ngCordova', 'firebase', 'firebase.utils', 'starter.controllers', 'starter.services', 'starter.config', 'starter.auth']) 

.run(function($ionicPlatform, Auth, $rootScope) { 


    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    } 
    if (window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 



    //stateChange event 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
     if (toState.authRequired && !Auth.isAuthenticated()){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
     } 
    }); 





}) 

.config(function($stateProvider, $urlRouterProvider) { 

    // Ionic uses AngularUI Router which uses the concept of states 
    // Learn more here: https://github.com/angular-ui/ui-router 
    // Set up the various states which the app can be in. 
    // Each state's controller can be found in controllers.js 
    $stateProvider 

    // setup an abstract state for the tabs directive 
    .state('tab', { 
    url: "/tab", 
    abstract: true, 
    templateUrl: "templates/tabs.html" 
    }) 

    // Each tab has its own nav history stack: 

    .state('tab.dash', { 
    url: '/dash', 
    views: { 
     'tab-dash': { 
     templateUrl: 'templates/tab-dash.html', 
     controller: 'DashCtrl', 
     authRequired: true 
     }, 
    } 
    }) 

    .state('tab.chats', { 
     url: '/chats', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/tab-chats.html', 
      controller: 'ChatsCtrl', 
      authRequired: true 
     } 
     } 
    }) 
    .state('tab.chat-detail', { 
     url: '/chats/:chatId', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/chat-detail.html', 
      controller: 'ChatDetailCtrl', 
      authRequired: true 
     } 
     } 
    }) 

    .state('tab.friends', { 
     url: '/friends', 
     views: { 
     'tab-friends': { 
      templateUrl: 'templates/tab-friends.html', 
      controller: 'FriendsCtrl', 
      authRequired: true 
     } 
     } 
    }) 
    .state('tab.friend-detail', { 
     url: '/friend/:friendId', 
     views: { 
     'tab-friends': { 
      templateUrl: 'templates/friend-detail.html', 
      controller: 'FriendDetailCtrl', 
      authRequired: true 
     } 
     } 
    }) 

    .state('tab.account', { 
    url: '/account', 
    views: { 
     'tab-account': { 
     templateUrl: 'templates/tab-account.html', 
     controller: 'AccountCtrl', 
      authRequired: true 
     } 
    } 
    }) 

    .state('tab.example', { 
    url: '/example', 
    views: { 
     'tab-example': { 
     templateUrl: 'templates/tab-example.html', 
     controller: 'ExampleCtrl', 
      authRequired: true 
     } 
    } 
    }) 


    .state('tab.overview', { 
    url: '/overview', 
    views: { 
     'tab-overview': { 
     templateUrl: 'templates/tab-overview.html', 
     controller: 'OverviewCtrl', 
      authRequired: true 
     } 
    } 
    }) 

    .state('tab.login', { 
    url: '/login', 
    views: { 
     'tab-login': { 
     templateUrl: 'templates/tab-login.html', 
     controller: 'LoginCtrl', 
      authRequired: true 
     } 
    } 
    }); 

    // if none of the above states are matched, use this as the fallback 
    $urlRouterProvider.otherwise('/tab/dash'); 

}) 

index.html

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
    <title></title> 

    <link href="lib/ionic/css/ionic.css" rel="stylesheet"> 
    <link href="css/style.css" rel="stylesheet"> 

    <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above 
    <link href="css/ionic.app.css" rel="stylesheet"> 
    --> 

    <!-- ionic/angularjs js --> 
    <script src="lib/ionic/js/ionic.bundle.js"></script> 


    <!-- firebase and simple login --> 
    <script src="https://cdn.firebase.com/libs/angularfire/0.9.1/angularfire.min.js"></script> 
    <script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script> 


    <!-- cordova script (this will be a 404 during development) --> 
    <script src="lib/ngCordova/dist/ng-cordova.js"></script> 
    <script src="cordova.js"></script> 

    <!-- your app's js --> 
    <script src="js/app.js"></script> 
    <script src="js/controllers.js"></script> 
    <script src="js/services.js"></script> 



    </head> 
    <body ng-app="starter"> 
    <!-- 
     The nav bar that will be updated as we navigate between views. 
    --> 
    <ion-nav-bar class="bar-stable"> 
     <ion-nav-back-button> 
     </ion-nav-back-button> 
    </ion-nav-bar> 
    <!-- 
     The views will be rendered in the <ion-nav-view> directive below 
     Templates are in the /templates folder (but you could also 
     have templates inline in this html file if you'd like). 


    --> 

    <ion-nav-view animation="slide-left-right"></ion-nav-view> 



    </body> 
</html> 
+0

Bạn có sử dụng router ui hoặc ngRouter chính thức? Đối với bản thân mình, tôi sử dụng bộ định tuyến ui và ở mỗi trạng thái, tôi có thể lưu dữ liệu tùy chỉnh như boolean có tên "công khai", quyết định xem trạng thái tương ứng có cần xác thực hay không. Tôi có thể cung cấp cho bạn thông tin chi tiết hơn nếu bạn muốn một cái gì đó như thế. –

+0

Xin chào Himmet. Thành thật mà nói tôi không biết, tôi nghĩ rằng một tiêu chuẩn đi kèm với Ionic Framework. Có xin vui lòng chia sẻ phương pháp của bạn! – AMG

+0

Tôi có thể nhận được câu trả lời được chấp nhận để hoạt động. Một sự khác biệt trong mã của tôi là tôi có 'authRequired' làm tài sản của tiểu bang và không được lồng trong khung nhìn của tiểu bang. Nếu không, nó nhìn với tôi rằng bạn cần phải sửa đổi 'toState.authRequire' để kiểm tra bên trong của toState.view – liampronan

Trả lời

15

Bạn đang ở gần đó. Tất cả những gì bạn cần là đảm bảo trạng thái của bạn được đánh dấu phù hợp với thuộc tính tùy chỉnh 'AuthRequired' và lắng nghe sự kiện $ stateChangeStart để kiểm tra xác thực. Sự kiện này kích hoạt mỗi khi bạn di chuyển trong ứng dụng.

.run(function($ionicPlatform, AuthService) { 
     //ionic init code  

     //stateChange event 
     $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
     if (toState.authRequired && !AuthService.isAuthenticated()){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
     } 
    }); 
} 

.state('tab.dash', { 
    url: '/dash', 
    views: { 
     'tab-dash': { 
     templateUrl: 'templates/tab-dash.html', 
     controller: 'DashCtrl', 
     authRequired: true 
     } 
    } 
    }) 

    .state('tab.chats', { 
     url: '/chats', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/tab-chats.html', 
      controller: 'ChatsCtrl', 
      authRequired: true 
     } 
     } 
    }) 

Nơi tốt nhất để có $ stateChangeStart trình xử lý sự kiện sẽ là ứng dụng chạy.

+0

Cảm ơn câu trả lời. Tôi không nhận được nó chính xác nơi và làm thế nào để đặt stateChangeStart? – AMG

+0

@AMG stateThay đổi bộ điều khiển sự kiện phải được đặt trong hàm chạy nơi bạn khởi tạo ion. chức năng chạy là gần nhất với phương pháp chính trong góc, được thực thi khi ứng dụng được tải. Tôi đã cập nhật mã cho bạn – Karthik

+0

Cảm ơn bạn đã cập nhật. Nó không có vẻ làm việc cho tôi vì tôi có trạng thái của tôi trong .config. AuthService là Auth? – AMG

0

Để thành công đọc các giá trị sử dụng:

toState.authRequired 

Vui lòng di chuyển authRequired: true bên trong .state thay vì views.

2

Tôi đã gặp vấn đề tương tự như của bạn! Hãy xem cách tôi giải quyết nó!

app.js

angular.module('app', ['ionic','firebase', 'app.controllers', 'app.routes', 'app.directives','app.services','app.filters',]) 

.run(function($ionicPlatform, $rootScope, $state) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 
    } 
    if (window.StatusBar) {// 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 

    //stateChange event 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
    var user = firebase.auth().currentUser; 
    if (toState.authRequired && !user){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
    } 
    }); 
    // Initialize Firebase Here 

}) 

routes.js

angular.module('app.routes', ['ionicUIRouter']) 

.config(function($stateProvider, $urlRouterProvider) { 

    $stateProvider 

    .state('login', { 
    url: '/login', 
    templateUrl: 'templates/login.html', 
    controller: 'loginCtrl' 
    }) 

.state('menu', { 
    url: '/menu', 
    templateUrl: 'templates/menu.html', 
    abstract:true, 
    controller: 'menuCtrl' 
    }) 

    .state('menu.dash', { 
    url: '/contas', 
    templateUrl: 'templates/dash.html', 
    controller: 'contasCtrl', 
    authRequired: true 
    }) 

$urlRouterProvider.otherwise('/login') 

}); 
Các vấn đề liên quan