2014-12-30 5 views
0

Я пытаюсь реализовать постоянный логин для углового приложения. Постоянным я имею в виду, что я могу перенаправить на новую страницу или обновить, не выйдя из системы.GET маршрут не попадает в угловое приложение

Глядя на отладчик, не появляется, что мой/api/user route когда-либо попадает. api/sessions и я не уверен, почему другого не было бы.

мой код:

routes.js

app.post('/api/sessions', function(req, res, next) { 
    User.findOne({username: req.body.username}) 
    .select('password').select('username') 
    .exec(function(err, user){ 
     if (err) {return next(err)} 
     if (!user) {return res.send(401)} 
     bcrypt.compare(req.body.password, user.password, function (err, valid){ 
     if (err) {return next(err)} 
     if (!valid) {return res.send(401)} 
     var token = jwt.encode({username: user.username}, config.secret) 
     res.send(token) 
     }) 
    }) 
    }) 

    app.get('/api/users', function(req, res, next) { 
    if(!req.headers['x-auth']){ 
     return res.send(401) 
    } 
    var auth = jwt.decode(req.headers['x-auth'], config.secret) 
    User.findOne({username: auth.username}, function (err,user){ 
     if (err) {return next(err)} 
     res.json(user) 
    }) 
    }) 

    app.post('/api/users', function(req, res, next) { 
    var user = new User({username: req.body.username}) 
    bcrypt.hash(req.body.password, 10, function (err, hash){ 
     if (err) {return next (err)} 
     user.password = hash 
     user.save(function (err){ 
     res.send(201) 
     }) 
    }) 
    }) 

angular.js

app.service('UserSvc', function($http, $window){ 
    var svc = this; 
    svc.getUser = function() { 
     return $http.get('/api/users',{ 
     headers: { 'X-Auth': this.token } 
     }) 
    } 
    svc.login = function(username, password){ 
     return $http.post('/api/sessions', { 
     username: username, password: password 
     }).then(function(val){ 
     svc.token = val.data 
     // window.localStorage.token = val.data 
     return svc.getUser() 
     }) 
    } 

    svc.logout = function() { 
     $http.post('/api/sessions', { 
     username: null, password: null 
     }).then(function(val){ 
     svc.token = null 
     // window.localStorage.token = val.data 
     }) 
    } 
    }) 

    app.controller('LoginCtrl', function($scope, $location, UserSvc){ 
    $scope.login = function(username, password) { 
     UserSvc.login(username, password) 
     .then(function(response) { 
     $scope.$emit('login', response.data) 
     $location.path('/dashboard'); 
     }) 
    } 
    $scope.logout = function() { 
     UserSvc.logout(); 
     $scope.$emit('logout') 
    } 
    }); 

    app.controller('ApplicationCtrl', function($scope, UserSvc) { 

    angular.element(document).ready(function() { 
     $scope.currentUser = UserSvc.getUser(); 
    }) 

    $scope.modalShown = true; 

    $scope.$on('login', function (_, user){ 
     $scope.currentUser = user; 
    }) 

    $scope.$on('logout', function(){ 
     $scope.currentUser = null; 
    }) 
    }); 

если кто имеет какие-либо указатели, пожалуйста, дайте мне знать! Я провел так много времени, на это :(

+0

'' '' '' '' '' '' ''' '' '' '' '' '' '' '' headers: {'X-Auth': this.token} 'это может быть опечатка на' this.token --- >>> svc.token', но это, вероятно, не решит всю проблему. Если вы используете [http-interceptor, как показано в этом репозитории] (https://github.com/witoldsz/angular-http-auth), вам будет меньше проблем. Что хорошего в этом пакете - это метод [loginConfirmed] (https://github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js#L24), который позволяет вам преобразовать неудачные запросы, например, добавили заголовок/токен к ним, прежде чем запросы снова будут запущены. –

ответ

-1

Я считаю, что проблема довольно просто здесь. услуги должны быть созданы (с новым UserSvc). заводы не делают. Так что, если вы хотите его использовать его в вы можете изменить UserSvc на завод и вернуть его svc.

Другое дело, что Фабрики/Сервисы являются одноточечными, поэтому возвращение svc вместе с переменной, содержащей результирующий пользовательский объект, будет сохраняться через (или в localStorage с каким-то таймаутом).

Смежные вопросы