/ / Właściwy sposób obsługi uwierzytelniania - angularjs, uwierzytelnianie, firebase, firebase-security

Właściwy sposób obsługi uwierzytelniania - angularjs, uwierzytelnianie, firebase, firebase-security

Przeczytałem wiele różnych przykładów implementacji uwierzytelniania w aplikacji Angular. ja używam Firebase Proste logowanie jako (Nie-) Backend.

Użytkownicy powinni widzieć tylko zawartość mojej aplikacji po zalogowaniu. Jeśli są wylogowani, widzą tylko /auth/login i /auth/register. Obecnie mam następujące rozwiązanie, które działa. Ale:

1) Nie jestem pewien, czy jest to kuloodporne, ponieważ ...

2) ... kiedy otwieram /home ręcznie, gdy NIE jestem zalogowany, jestem poprawnie przekierowywany na /auth/login ale HomeCtrl i tak zostaje stracony. Żadne poufne dane nie są ujawniane, ponieważ żadne dane nie są zwracane z zaplecza, ale musi istnieć sposób, aby w ogóle NIE wykonać kontrolera, jeśli jestem wylogowany?

3) Czy za każdym razem, gdy ujawniam poufne dane, muszę sprawdzać w kontrolerze, czy użytkownik jest wielokrotnie uwierzytelniany?

Pytanie dodatkowe: Jak przekierować do /home po pomyślnym zalogowaniu? Obecnie robię to w ramach mojej usługi AuthService $location.path("home"); po pomyślnym zalogowaniu, ale to nie uwzględnia stanu ?!

Moja aplikacja.js:

angular.module("myApp", ["ionic", "firebase", "myApp.services", "myApp.controllers"])

.run(function($rootScope, $location, AuthService) {
$rootScope.$on("$stateChangeStart", function (ev, to, toParams, from, fromParams) {

/**
* AuthService.isLoggedIn() returns TRUE or FALSE
* depending on whether user authenticated successfully
* against the Firebase backend
*/

// redirect to login
if (!AuthService.isLoggedIn() && to.name !== "auth.register") {
$location.path("/auth/login");
}
});
})

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

$stateProvider

.state("auth", {
url: "/auth",
abstract: true,
templateUrl: "templates/auth-tabs.html",
controller: "AuthCtrl"
})

.state("auth.login", {
url: "/login",
views: {
"login-tab": {
templateUrl: "templates/auth-login.html"
}
}
})

.state("auth.register", {
url: "/register",
views: {
"register-tab": {
templateUrl: "templates/auth-register.html"
}
}
})

.state("home", {
url: "/home",
templateUrl: "templates/home.html",
controller: "HomeCtrl"
});

$urlRouterProvider.otherwise("/home");

});

Odpowiedzi:

1 dla odpowiedzi № 1

Zaimplementowałem to poprzez obsługę pliku 401 Odpowiedź serwera http, ponieważ nie chcę się martwić sprawdzaniem stanu uwierzytelnienia użytkownika, wolę pozwolić serwerowi to obsłużyć.

Dokumentacja na $urlRouter.sync() określa, że ​​jeśli zapobiegniesz domyślnemu zdarzeniu, możesz ręcznie wyzwolić succesChange

angular.module("app", ["ui.router"]);
.run(function($rootScope, $urlRouter) {
$rootScope.$on("$locationChangeSuccess", function(evt) {
// Halt state change from even starting
evt.preventDefault();
// Perform custom logic
var meetsRequirement = ...
// Continue with the update and state transition if logic allows
if (meetsRequirement) $urlRouter.sync();
});
});

Dokumentacja $ urlRouter