我正在用后端的angularjs路由(ngRoute)和expressjs设置一个Web应用程序。
我很怀疑,我不明白为什么检查用户是否登录的“标准”解决方案是在本地存储中查找令牌。我的意思是,任何时候都不会检查其有效性。用户可以在浏览器中手动插入令牌。
我知道,当用户尝试执行操作服务器端会意识到该用户未登录,但是我认为对于手动将令牌插入< strong>访问一些私人路线(例如,创建表单)。
我不知道如何解决此问题。 我试图向服务器询问应用程序运行中的有效性。问题在于程序在第一次路由之前不会等待promise。
var appRun = function($rootScope, $location, $route, $timeout, API_URL, auth, authToken) {
//running...
auth.getProfile();
$rootScope.$on('$locationChangeStart', function(event, next, current) {
var routeUrl = '/' + current.replace(API_URL, '').split('/')[1];
routeUrl = getRouteParams(routeUrl);
var routeObj = $route.routes[routeUrl];
var userProfile = authToken.isAuthenticated(), redirectPath;
//not valid route
if (!routeObj) {
redirectPath = getRedirectPath(userProfile);
$location.path(redirectPath);
}
//restricted route
else if (routeObj.restricted && userProfile !== 'LOGGED') {
redirectPath = getRedirectPath(userProfile);
$location.path(redirectPath);
}
...
}
}
//In auth service...
...
getProfile: function() {
if (!(!!authToken.getToken())) {
return authToken.setUserProfile('FORBIDDEN')
}
//if the token exists check it
return $http.get(API_URL + '/auth')
.then(function(response) {
authToken.setUserProfile(response.data.status);
return response;
})
.catch(function(error) {
return authToken.setUserProfile(error.data.message);
});
}
...
答案 0 :(得分:0)
为什么在Stackoverflow上有如此多的示例将拒绝的承诺转换为已实现的承诺?
//In auth service...
...
getProfile: function() {
if (!(!!authToken.getToken())) {
̶ ̶r̶e̶t̶u̶r̶n̶ ̶a̶u̶t̶h̶T̶o̶k̶e̶n̶.̶s̶e̶t̶U̶s̶e̶r̶P̶r̶o̶f̶i̶l̶e̶(̶'̶F̶O̶R̶B̶I̶D̶D̶E̶N̶'̶)̶
authToken.setUserProfile('FORBIDDEN')
return $q.reject("FORBIDDEN - No token");
}
//if the token exists check it
return $http.get(API_URL + '/auth')
.then(function(response) {
authToken.setUserProfile(response.data.status);
return response;
})
.catch(function(error) {
̶r̶e̶t̶u̶r̶n̶ ̶a̶u̶t̶h̶T̶o̶k̶e̶n̶.̶s̶e̶t̶U̶s̶e̶r̶P̶r̶o̶f̶i̶l̶e̶(̶e̶r̶r̶o̶r̶.̶d̶a̶t̶a̶.̶m̶e̶s̶s̶a̶g̶e̶)̶;̶
authToken.setUserProfile(error.data.message);
//RE-THROW rejected promises
throw error;
});
}
当承诺错误处理程序returns为一个值时,$ q服务将被拒绝的承诺转换为已实现的承诺。要保留拒绝状态,请re-throw原因或返回 rejected 承诺。
似乎有人采用了名为getProfile
的函数,并对其进行了黑化以增加副作用。他们没有使用Profile
承诺,而是放弃了承诺并使用了副作用。
返回拒绝的诺言的函数可用于路由解析函数中止加载路由:
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/Book/:bookId', {
templateUrl: 'book.html',
controller: 'BookController',
resolve: {
profile: function(auth) {
return auth.getProfile();
}
}
})
})
当auth.getProfile()
函数返回拒绝的诺言时,ngRoute路由器会中止视图的加载并广播$routeChangeError事件。
有关更多信息,请参见