javascript - ejemplos - paginas web con angularjs
AngularJS: maneja las rutas antes del inicio de la aplicaciĆ³n (1)
¿Está bien usar un Servicio dentro de $stateProvider
, para este propósito?
He pasado por muchos mensajes en la pila con respecto al enrutamiento, pero la mayoría son confusos para principiantes ya que todos usan un enfoque diferente y lo tratan como ciencia de cohetes. Me gustaría desarrollar buenos hábitos desde el principio y evitar los malos ...
Objetivo : ejecutar algunas funciones antes de que se inicie la aplicación y en función de esa ruta de salida mi usuario final.
Lo que he intentado:
Implementar un servicio >> AuthService
| Acciones >> verificación simple para:
- Obtiene token JWT desde el lado del cliente (DB SQLite) - El token contiene detalles básicos + clave API
- Enviar al servidor para la autenticación
- Respuesta (booleana)
- Si está autorizado >> carga la vista de inicio. De lo contrario, redirija para registrar View.
- La validación del lado del servidor se lleva a cabo antes de cargar cualquier vista
Proveedores de servicio
myApp.factory(''AuthService'', function ( Session) {
var authService = {};
authService.isAuthorized = function(){
return Session.authorized() ;
};
return authService;
});
myApp.service(''Session'', function ($resource, $q, $timeout, URL_Config) {
this.authorized = function () {
var deferred = $q.defer();
$timeout(function () {
var db = window.openDatabase("config.db", "1.0", "Config", 2 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql("SELECT * FROM user_details", [], function (tx, data) {
var token = data.rows.item(0).token;
var request = $resource(URL_Config.BASE_URL + ''/authCheck'', {token: token },
{ query: {
isArray: false,
method: ''GET''
} });
request.query(function (res) {
if (res.error) {
deferred.resolve(false);
} else {
deferred.resolve(true);
}
});
}, function (e) {
deferred.resolve(false);
});
});
}, 500);
return deferred.promise;
};
return this;
});
Configuración de ruta
Esta es la parte con la que estoy luchando. ¿Dónde y cómo inyectar este servicio? Lo tengo funcionando, pero no estoy seguro de si esta es la forma correcta de manejarlo.
- ¿Llamar al servicio dentro de la propiedad de
$stateProvider
de$stateProvider
? - basado en el valor de
AuthService
redirigir para ver - Proceso antes de que comience la aplicación.
myApp.config(function($stateProvider, $urlRouterProvider ) {
$urlRouterProvider.otherwise(''/home'');
$stateProvider
.state(''home'', {
url: ''/home'',
templateUrl: ''templates/home.html'',
controller: ''MainController'',
resolve: [''AuthService'', function(AuthService, $location, $q){
var deferred = $q.defer();
var authChk = AuthService.isAuthorized();
authChk.then(function(data){
if(!data){
$location.path(''/register'');
deferred.resolve();
} else{
$location.path(''/home'');
deferred.resolve();
}
}, function(e){
$location.path(''/register'');
deferred.resolve();
});
return deferred.promise;
}]
})
.state(''register'', {
url: ''/register'',
templateUrl: ''templates/register.html'',
controller : ''RegisterController'',
resolve: [''AuthService'', function(AuthService, $location, $q){
var deferred = $q.defer();
var authChk = AuthService.isAuthorized();
authChk.then(function(data){
if(!data){
$location.path(''/register'');
deferred.resolve();
} else{
$location.path(''/home'');
deferred.resolve();
}
}, function(e){
$location.path(''/register'');
deferred.resolve();
});
return deferred.promise;
}]
})
});
¿Es este el lugar apropiado para ejecutar dicha validación de Autenticación?
Esta es una demostración simple de Hello World para comenzar con Angular. No tengo navegación (vistas múltiples) por lo que la verificación debe ser directa.
He visto muchos ejemplos usando locationChangeStart
para iniciar un servicio antes de que se cargue una vista. Luego, $scope.watch
y $broadcast
se usan cuando se manejan sesiones (tampoco es el caso) pero pueden ser útiles para usos futuros.
Gracias. Cualquier consejo sobre cómo y dónde manejar este escenario es bienvenido.
Esto es realmente algo que tuve que hacer también. Puede usar la resolve
en cada uno de los estados.
En el siguiente código, tengo una función resolveUserAuth que devolverá el objeto del usuario.
var resolveUserAuth = {
''userAuth'': function (AuthService, $rootScope) {
if ($rootScope.user) {
return $rootScope.user;
} else {
return myApp._getUserAuth(AuthService, $rootScope);
}
}
};
$stateProvider
.state(''login'', {
url: ''/login'',
templateUrl: ''views/login.html'',
controller: ''LoginCtrl''
})
.state(''logout'', {
url: ''/logout'',
templateUrl: ''views/login.html'',
controller: ''LoginCtrl''
})
.state(''home'', {
url: ''/home'',
templateUrl: ''views/home.html'',
controller: ''HomeCtrl'',
resolve: resolveUserAuth
})
getUserAuth
myApp._getUserAuth = function (service, rootScope) {
return service.getRole().then(function () {
service.getUser().then(function (user) {
rootScope.user = user;
});
});
};
iniciar sesión
service.login = function (data) {
var promise = $http.post(''/auth/login'', data).then(function (response) { // Success
$rootScope.user = response.data;
AssignedService.get({},
function(assigned) {
$rootScope.assigned = assigned;
$rootScope.showLogin = false;
}, function(error) {
if (console && console.error) {
console.error(''Error getting assigned: '', error);
}
}
);
return response;
}, function() { // Error
$rootScope.showAlert(''Unable to login, please try again'', ''danger'');
});
return promise;
};