Estoy tratando de escribir un interceptor HTTP para que mi aplicación AngularJS maneje la autenticación.
Este código funciona, pero me preocupa inyectar manualmente un servicio ya que pensé que se supone que Angular maneja esto automáticamente:
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(function ($location, $injector) {
return {
'request': function (config) {
//injected manually to get around circular dependency problem.
var AuthService = $injector.get('AuthService');
console.log(AuthService);
console.log('in request interceptor');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
})
}]);
Lo que comencé a hacer, pero encontré problemas de dependencia circular:
app.config(function ($provide, $httpProvider) {
$provide.factory('HttpInterceptor', function ($q, $location, AuthService) {
return {
'request': function (config) {
console.log('in request interceptor.');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
});
$httpProvider.interceptors.push('HttpInterceptor');
});
Otra razón por la que me preocupa es que la sección sobre $ http en Angular Docs parece mostrar una forma de inyectar las dependencias de la "forma normal" en un interceptor Http. Consulte su fragmento de código en "Interceptores":
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// optional method
'request': function(config) {
// do something on success
return config || $q.when(config);
},
// optional method
'requestError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
},
// optional method
'response': function(response) {
// do something on success
return response || $q.when(response);
},
// optional method
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
};
}
});
$httpProvider.interceptors.push('myHttpInterceptor');
¿Dónde debería ir el código anterior?
Supongo que mi pregunta es ¿cuál es la forma correcta de hacer esto?
Gracias, y espero que mi pregunta haya sido lo suficientemente clara.
$http
. La única forma de evitarlo que he encontrado es usar $injector.get
, pero sería genial saber si hay una buena manera de estructurar el código para evitar esto.