Я настраиваю веб-приложение с маршрутизацией angularjs (ngRoute) и expressjs в бэкэнде.
У меня есть сомнение, Я не понимаю, почему «стандартное» решение для проверки, зарегистрирован ли пользователь или нет, ищет токен в локальном хранилище . Я имею в виду, его действительность не проверяется в любое время . Пользователь может вручную вставить токен в браузер.
Мне известно, что когда пользователь пытается выполнить операцию , серверная сторона понимает, что пользователь не зарегистрирован , но я думаю, что все еще возможно для пользователя, который вручную вставляет токен в доступ к некоторым личным маршрутам (например, форма создания).
Я не знаю, как решить эту проблему. Я пытался запросить у сервера допустимость запуска приложения . Проблема в том, что программа не ждет обещания перед первой маршрутизацией.
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);
});
}
...