2016-06-19 2 views
2

Я создаю приложение MEAN-стека и, наконец, добираюсь до точки создания аутентификации пользователя. Для этого я последовал этому руководству: http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619Согласование Express (Passport) и AngularJS Маршруты

Теперь, когда я включаю это в свой проект, он работает, но только частично. А именно, кажется, что единственной страницей, которую я могу правильно подойти, является домашняя страница приложения. Если я нажимаю на какие-либо ссылки или набираю что-то другое, кроме дома, в адресной строке, он возвращает меня на экран входа в систему.

Каковы возможные причины этого?

Мои маршруты/index.js файл выглядит следующим образом:

var express = require('express'); 
var router = express.Router(); 

var isAuthenticated = function (req, res, next) { 
    // if user is authenticated in the session, call the next() to call the next request handler 
    // Passport adds this method to request object. A middleware is allowed to add properties to 
    // request and response objects 
    if (req.isAuthenticated()) 
     return next(); 
    // if the user is not authenticated then redirect him to the login page 
    res.redirect('/'); 
} 

module.exports = function(passport){ 

    /* GET login page. */ 
    router.get('/', function(req, res) { 
     // Display the Login page with any flash message, if any 
     res.render('index', { message: req.flash('message') }); 
    }); 

    /* Handle Login POST */ 
    router.post('/login', passport.authenticate('login', { 
     successRedirect: '/home', 
     failureRedirect: '/', 
     failureFlash : true 
    })); 

    /* GET Registration Page */ 
    router.get('/signup', function(req, res){ 
     res.render('register',{message: req.flash('message')}); 
    }); 

    /* Handle Registration POST */ 
    router.post('/signup', passport.authenticate('signup', { 
     successRedirect: '/home', 
     failureRedirect: '/signup', 
     failureFlash : true 
    })); 

    /* GET Home Page */ 
    router.get('/home', isAuthenticated, function(req, res){ 
     res.render('home', { user: req.user }); 
    }); 

    /* Handle Logout */ 
    router.get('/signout', function(req, res) { 
     req.logout(); 
     res.redirect('/'); 
    }); 

    return router; 
} 

У меня также есть некоторые AngularJS маршруты, указанные в другом файле (приложение работало отлично с ними, прежде чем я начал добавлять аутентификации).

app.config(['$routeProvider', function($routeProvider){ 
    $routeProvider 

     .when('/', { 
      templateUrl: 'partials/home.html', 
      controller: 'HomeCtrl' 
     }) 

     .when('/calendar',{ 
      templateUrl: 'partials/calendar.html', 
      //controller: 'Calendar' 
     }) 

     .when('/add-activity', { 

      templateUrl: 'partials/activity-form.html', 
      controller: 'AddActivityCtrl' 
     }) 

     .when('/activity/:id',{ 
      templateUrl: 'partials/activity-form.html', 
      controller: 'EditActivityCtrl' 
     }) 

     .when('/activity/delete/:id', { 
      templateUrl: 'partials/activity-delete.html', 
      controller: 'DeleteActivityCtrl' 
     }) 

     .otherwise({ 
      redirectTo: '/' 
     }); 
}]); 

Есть ли что-то, что мне не хватает?

P.S. Я заметил, что в настоящее время мой URL домашней странице

http://localhost:3000/home#/

тогда как ранее это было

http://localhost:3000/#/

Я добавил "дом", чтобы отличать от «/ ", который является страницей аутентификации; однако я не уверен, как «#» привязано к пути в первой цитате.

+0

Я бы переместить 'уаг isAuthenticated' под' module.exports = функция (паспорт) { ', как я не уверен, если паспорт существует в этом контексте. Если это не помогло, запустите комментирование 'res.redirect ('/')' и 'redirectTo: '/'', чтобы понять, в чем причина. – faster

+0

@faster, просто чтобы убедиться, что я правильно понимаю, что мне делать с комментариями перенаправления? – MadPhysicist

+0

Просто, чтобы понять, какой из них работал. – faster

ответ

0

Я смог решить это следующим образом. Я изменил маршрут Экспресс содержать

"логин"

маршрут и изменил домашний маршрут только

"/"

В результате, домашний путь стал

http://localhost:3000/#/

Хэш знак пристегивается с помощью и для угловой. По моему мнению, Угловая трактует такой путь, как «/». Затем оставшаяся маршрутизация выполняется с помощью Angular, и у меня есть одностраничное приложение AngularJS.

Рабочий код: Экспресс

var express = require('express'); 
var router = express.Router(); 

module.exports = function(passport){ 

    var isAuthenticated = function (req, res, next) { 
      // if user is authenticated in the session, call the next() to call the next request handler 
      // Passport adds this method to request object. A middleware is allowed to add properties to 
      // request and response objects 
      if (req.isAuthenticated()){ 
       //console.log(next()); 
       return next(); 
      } 
      // if the user is not authenticated then redirect him to the login page 
      res.redirect('/login'); 
    } 


    /* GET login page. */ 
    router.get('/login', function(req, res) { 
     // Display the Login page with any flash message, if any 
     res.render('login', { message: req.flash('message') }); 
    }); 

    /* Handle Login POST */ 
    router.post('/login', passport.authenticate('login', { 
     successRedirect: '/', 
     failureRedirect: '/login', 
     failureFlash : true 
    })); 

    /* GET Registration Page */ 
    router.get('/signup', function(req, res){ 
     res.render('register',{message: req.flash('message')}); 
    }); 

    /* Handle Registration POST */ 
    router.post('/signup', passport.authenticate('signup', { 
     successRedirect: '/', 
     failureRedirect: '/signup', 
     failureFlash : true 
    })); 

    /* GET Home Page when logged in */ 
    router.get('/', isAuthenticated, function(req, res){ 
     res.render('index', { user: req.user }); 
    }); 

    /* GET Home Page */ 
    router.get('/', isAuthenticated, function(req, res){ 
     res.render('index', { user: req.user }); 
    }); 

    /* Handle Logout */ 
    router.get('/signout', function(req, res) { 
     req.logout(); 
     res.redirect('/login'); 
    }); 

    return router; 
} 

Работа Код: Угловая

app.config(['$routeProvider', function($routeProvider){ 
    $routeProvider 

     .when('/', { 
      templateUrl: 'partials/home.html', 
      controller: 'HomeCtrl' 
     }) 

     .when('/calendar',{ 
      templateUrl: 'partials/calendar.html', 
      //controller: 'Calendar' 
     }) 

     .when('/add-activity', { 

      templateUrl: 'partials/activity-form.html', 
      controller: 'AddActivityCtrl' 
     }) 

     .when('/activity/:id',{ 
      templateUrl: 'partials/activity-form.html', 
      controller: 'EditActivityCtrl' 
     }) 

     .when('/activity/delete/:id', { 
      templateUrl: 'partials/activity-delete.html', 
      controller: 'DeleteActivityCtrl' 
     }) 

     .otherwise({ 
      redirectTo: '/' 
     }); 
}]); 
Смежные вопросы