Bloquear páginas com login no AngularJS com chamada assíncrona - Stack Overflow em Português
Em uma aplicação feita com AngularJS, algumas páginas são protegidas por login.
Configurei o módulo da seguinte forma:
var app = angular.module('App', ['ngRoute', 'ngTouch', 'mobile-angular-ui']);
app.config(['$routeProvider','$locationProvider', function ($routeProvider, $locationProvider) {
.run(function ($rootScope, $route, $location, Data, Session) {
var nextPath = $location.path();
var nextRoute = $route.routes[nextPath];
if (nextRoute.requireLogin && !Session.getUserAuthenticated()) {
Repare que no fim do código acima, tenho um service (Session.getUserAuthenticated()) que faz a verificação se o utilizador fez login antes de mudar a rota, veja o código:
app.service('Session', function($http) {
this.getUserAuthenticated = function() {
$http.post('api/v1/session').then(function (results) {
if(results.data.uid) auth = true;
O problema é que o serviço acima retorna sempre false, uma vez que faz o return antes da resposta do $http.post, como resolvo o problema? É possível esperar pela resposta do POST ou a lógica que estou a usar é incorrecta?
editada 30/10/14 às 17:17
perguntada 30/10/14 às 16:52
Passe um callback para a o serviço. Mas o mais recomendado acredito que seja não enviar as partes que só devem ser acessadas quando autenticado. – Vinícius Gobbo A. de Oliveira 30/10/14 às 16:56
Na verdade você está retornando auth false pois ele é retornado antes do POST ocorrer. O post é assíncrono. Neste caso deves trabalhar com CallBack ou Promisses para só retornar se está autorizado dentro do resultado do POST – Caputo 30/10/14 às 16:56
@Caputo como seria isso? Teria que remover esse service ou altera-lo? Obrigado. – Filipe Moraes 30/10/14 às 17:02
@ViníciusGobboA.deOliveira esses bloqueio é só no frontend, no servidor também faço a verificação, isso seria apenas para evitar requests desnecessários. Mas como seria o recomendado? obrigado. – Filipe Moraes 30/10/14 às 17:05
Estou meio corrido aqui, não sei como está seu inglês, mas dê uma olhada nessa resposta e no link dela stackoverflow.com/a/16627409/3590714 – Caputo 30/10/14 às 17:17
Não testei, mas seria algo próximo a isso (já te dá um bom início):
return $http.post('api/v1/session');
E a verificação algo assim:
if (nextRoute.requireLogin) {
Session.getUserAuthenticated().success(function(results) {
if (results.data.uid) console.log('autorizado!');
else $location.path("/login");
respondida 31/10/14 às 13:57
Eu resolvi isso utilizando o "Resolve", porém ainda não consegui resolver alguns problemas para postar uma resposta completa, mas obrigado. – Filipe Moraes 31/10/14 às 14:42