Ответ 1
Я бы начал здесь, Витольд создал этот классный перехватчик, который работает с ответами на http. Я использую его, и это очень полезно.
Я ищу способ сделать эти две вещи, сначала я хочу перенаправить пользователя на страницу входа в систему, если не найден SessionID, и, во-вторых, я хотел бы услышать ваше мнение о сохранении идентификатора сеанса только в памяти (без файлов cookie).
Решение, которое я придумал для перенаправления:
1 - Создайте службу под названием OAuth, которая проверит, существует ли SessionID, а если нет, перенаправляется на страницу входа, служба также отвечает за методы входа и выхода.
app.factory('OAuth', ['$http', function ($http) {
var _SessionID = '';
return {
login: function () {
//Do login ans store sessionID in var _SessionID
},
logout: function () {
//Do logout
},
isLoggedIn: function () {
if(_SessionID) {
return true;
}
//redirect to login page if false
}
};
}]);
2 - Внесите новую службу OAuth в каждый контроллер и убедитесь, что пользователь isLoggedIn
app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) {
//check if user is logged
OAuth.isLoggedIn();
}]);
Вопросы:
1 - Метод isLoggedIn() будет вызываться во всех контроллерах, поэтому я задаюсь вопросом, есть ли способ сделать это без необходимости вводить службу и вызывать ее в каждом контроллере.
2 - Вместо того, чтобы иметь cookie для хранения sessionID, я хочу сохранить его в переменной OAuth _SessionID и для каждого запроса отправить его на сервер. Является ли это жизнеспособным/безопасным подходом? Можете ли вы дать мне несколько идей для этого?
Спасибо!
Я бы начал здесь, Витольд создал этот классный перехватчик, который работает с ответами на http. Я использую его, и это очень полезно.
Я использую аналогичную стратегию (перехват 401 ответов с сервера). Вы можете проверить здесь полный пример: https://github.com/Khelldar/Angular-Express-Train-Seed
Он использует node и mobgodb на бэкэнде для хранилища сеансов и обрезает HTTP-перехватчик на клиенте, который не повторяет запросы, подобные тому, который был связан с Dan Dan:
var interceptor = ['$q', '$location', '$rootScope', function ($q, $location, $rootScope) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
$location.path('/login');
}
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
В моем случае я использовал
Фрагмент кода выглядит следующим образом.
noteApp = angular.module('noteApp', ['ngRoute', 'ngCookies'])
.factory('authInterceptor', ['$rootScope', '$q', '$cookies', '$window',
function($rootScope, $q, $cookies, $window) {
return {
request: function (req) {
req.headers = req.headers || {};
if ($cookies.token) {
req.headers.Authorization = 'Bearer ' + $cookies.token;
}
return req;
},
responseError: function (rejection) {
if (rejection.status == 401) {
$window.location = '/auth';
}
return $q.reject(rejection);
}
}
}])
.config(['$routeProvider', '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
}
])
это сработает. Он отлично работает в моем приложении
var interceptor = function ($q, $location) {
return {
request: function (config) {//req
console.log(config);
return config;
},
response: function (result) {//res
console.log('Repos:');
console.log(result.status);
return result;
},
responseError: function (rejection) {//error
console.log('Failed with', rejection.status, 'status');
if (rejection.status == 403) {
$location.url('/dashboard');
}
return $q.reject(rejection);
}
}
};
module.config(function ($httpProvider) {
$httpProvider.interceptors.push(interceptor);
});