Вот как я это делаю.
- В
users
таблице БД добавить столбец с именем token VARCHAR(36)
- Всякий раз, когда пользователь входит в систему:
- обновляю
lastlogin
колонки обновление
- I, что лексема с
MD5($ip.$email.$logindate)
- Теперь я возвращаюсь объект пользователя в угловых и угловой знает токен.
В Угловом $http
услуга Я добавляю перехватчики и перед тем, как будет сделан запрос Authentication
. Я использую базовую аутентификацию. Я создаю строку $user_id.'::'.$token
.
app.factory('authInterceptor', function($rootScope, $q, appConfig, $injector, $cacheFactory) {
function request(config) {
if(angular.isDefined($rootScope.currentUser.id)) {
config.headers.Authorization = 'Basic ' +
window.btoa($rootScope.currentUser.id + ':' +
$rootScope.currentUser.token);
}
return config;
}
function response(response) {
if(angular.isDefined(response.data.code) && parseInt(response.data.code) == 401) {
var UserApi = $injector.get('UserApi');
UserApi.logout();
$cacheFactory.get('$http').removeAll();
UserApi.login(response.data.message)
.catch(function() {
var $state = $injector.get('$state');
$state.go('app.home');
});
}
return response || $q.when(response);
}
return {
request: request,
response: response
};
})
Это мой authInterceptor
завод, который я вставляю в приложение
app.config(function($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
})
Что происходит там я поставил стандартный Authentication
заголовок для каждого запроса, если пользователь авторизован.
Затем в PHP я получаю этот заголовок. Я получаю идентификатор пользователя и токен отдельно. Затем я использую идентификатор пользователя, чтобы получить данные пользователя из базы данных, где у меня есть токен и дата последнего входа.
Теперь я могу сравнивать маркер и посмотреть, если этот пользователь является тот, кто вошел в систему.
Но это не совсем безопасно. Если кто-нибудь получит этот токен, он сможет войти в систему. Вот почему используется IP. не только я проверяю токен на один в БД, я также проверяю его на IP. Я создаю MD5($ip.$email.$logindate)
, потому что я знаю все эти данные и проверяю против токена, который я получаю от углового. Если он был отправлен с другого IP-адреса, он не пройдет.
Вы также можете увидеть ответ функции в authInterceptor
. Всякий раз, когда у меня есть проблема с аутентификацией, я отправляю обратно код HTTP 401
. Теперь в ответ я знаю, что аутентификация завершилась неудачно. Я выхожу из системы и перенаправляю его на домашнюю страницу сайта.
Теперь код очень прост в кодировке. Вы просто возвращаете то, что нужно вернуть, и не заботятся ни о каком аутентифицированном пользователе.
Но есть еще. Если вам нужен какой-то ACL, тогда вы можете спроектировать это, как хотите. В вашем классе, возвращающем определенный метод RESTFull API, вы можете определить свойство $acl
и задать имя группы. Там же, где вы проверяете подлинность, вы также можете проверить ACL.
Пожалуйста, смотрите мой код здесь PHP бэкенд и Угловое интерфейс
https://github.com/Coach-Hub
Это основная идея, вы, конечно, можете построить вокруг этого.
Это было вдохновение, которое я искал. Большое спасибо. – KMK