我想知道如何将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('/');
}
感谢您的每一个提示
答案 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。