如何结合护照和angular-ui路由

时间:2014-12-15 13:13:16

标签: javascript angularjs node.js angular-ui-router passport.js

我想知道如何将angular-ui-routing与护照结合起来。 我找到的所有示例都使用node.js路由。

var routerApp = angular.module('routerApp', ['ui.router']);

routerApp.config(function($stateProvider, $urlRouterProvider) {

$urlRouterProvider.otherwise('/home');

$stateProvider

    .state('home', {
        url: '/home',
        templateUrl: 'partial-home.html'
    })

    .state('about', {
        // for example just show if is loggedIn       
    });

我将如何在上面的代码段中实现此功能?

function isLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated())
        return next();

    // if they aren't redirect them to the home page
    res.redirect('/');
}

感谢您的每一个提示

1 个答案:

答案 0 :(得分:9)

一种方法是在Angular中创建一个服务,该服务使用$ http命中Express中的端点。 $ http返回一个带有成功的promise和可用于更改状态的错误方法。如果您正在构建单页应用程序(SPA),这可能就是您需要知道的全部内容。例如:

// An Angular service that talks to Express
UserService.$inject = ['$http', '$state']; 

function UserService($http, $state) {

    this.loginUser = function (user) {
      $http.post("/api/login", user)
        .success(function (data, status) {
          console.log('Successful login.');
          console.log('data = ' + data); 
          console.log('status = ' + status); 
          $state.go('welcome'); // 
      })
        .error(function (data) {
          console.log('Error: ' + data);
          $state.go('somewhereelse'); 
      });
  }; 

$ state.go是一种UI路由器便捷方法,它将呈现您定义的状态。

在Express中,您需要为Passport编写自己的回调函数来控制返回的内容。例如:

 // Express Route with passport authentication and custom callback
  app.post('/api/login', function(req, res, next) {
      passport.authenticate('local-login', function(err, user, info) {
        if (err) {
        return next(err); 
      }
      if (user === false) {
        res.status(401).send(info.message);  
      } else {
        res.status(200).send(info.message); 
      }
    })(req, res, next); 
  });

在这个例子中,我使用的是“本地登录”Passport策略,它在后台运行它的魔力。如果用户通过身份验证,它将向Angular发回200,这将依次触发.success。否则它将发送401 Unauthorized并关闭.error。