Как добиться безопасного (!) система аутентификации в приложении angularjs?


Я новичок в angularjs...

Я прочитал документы и завершил учебник; я также попробовал что-то еще сам, и все начинает иметь смысл для меня.

теперь мне интересно, как сделать безопасная система аутентификации.

легкая часть: нет кода, я опишу операции, которые мой код выполняет:

У меня есть классическая форма: имя пользователя и пароль ввода текста.

пользователь заполняет форму и нажимает ENTER.

начинается запрос ajax, и ответ-это JSON, сообщающий мне что-то вроде" хорошо, я знаю тебя "или"я не знаю, кто ты".

теперь мне нужно сохранить зарегистрированный статус посетителя (или не зарегистрирован) между различными представлениями моего приложения.

Я читал в интернете, что для достижения этой цели, кто-то устанавливает переменную ($охвата.isLogged = true), кто-то еще использует куки; но переменные javascript, и файлы cookie можно легко редактировать с помощью firebug или аналогичных инструментов разработки.

... и напоследок вопрос:

и есть ли у вас какие-то предложения по достижению безопасной системы аутентификации в приложении angularjs?

5 57

5 ответов:

вы не можете ничего авторизовать в angularjs, потому что пользователь имеет полный контроль над средой выполнения (а именно, браузером). Каждый чек, случай, если-все, что вы можете придумать-может быть подделано. Существуют библиотеки javascript, которые используют асимметричные ключи для выполнения локального шифрования для безопасного хранения локальных данных, но на самом деле это не то, что вы ищете.

вы можете и должны авторизовать вещи на сервере-стандартный способ, которым вы это сделаете обычное приложение-использует сеанс; специальный код не требуется, вызовы ajax используют обычные куки сеанса. Приложение не должно знать, является ли оно аутентифицированным или нет. Ему нужно только проверить, что думает сервер.

с точки зрения вашего приложения angularjs, "вход в систему" или "выход из системы" - это просто подсказка gui для пользователя.

Вероятно, вы нашли решение, но в настоящее время я составил схему authenticaiton, которую я реализую в своем угловом приложении.

On .запуск приложения зарегистрирован с ActiveSession, установленным в false. Затем он проверяет, есть ли в браузере файл cookie с токеном и идентификатором пользователя.

Если да, проверьте token+userId на сервере и обновите токен как на сервере, так и на локальном (токен-это ключ, созданный сервером, уникальный для каждого пользователя)

Если форма входа не отображается, проверьте учетные данные и снова, если они действительны, запрос сервера t получает новый токен и сохраняет локально.

токен используется для постоянного входа в систему (помните меня в течение 3 недель) или когда пользователь обновляет страницу браузера.

спасибо

Authentication Scheme in Angular.js

Я задал этот вопрос три месяца назад.

Я хотел бы поделиться тем, что стало моим любимым подходом, когда мне приходится иметь дело с аутентификацией пользователей в веб-приложении, построенном на AngularJS.

конечно, ответ fdreger по-прежнему отличный ответ!

вы не можете ничего авторизовать в angularjs, потому что пользователь имеет полный управление средой выполнения (а именно браузером).

С точки зрения вашего angularjs приложение, будучи " вошел в систему" или "вышел из системы" - это просто подсказка gui для пользователя.

Итак, вкратце мой подход заключается в следующем:

1) привязать к каждому маршруту дополнительную информацию о маршруте.

$routeProvider.when('/login', { 
    templateUrl: 'partials/login.html', controller: 'loginCtrl', isFree: true
});

2) используйте службу для хранения данных о каждом пользователе и их статусе аутентификации.

services.factory('User', [function() {
    return {
        isLogged: false,
        username: ''
    };
}]);

3) каждый раз, когда пользователь пытается получить доступ к новому маршруту, проверьте, есть ли у них грант получить доступ.

$root.$on('$routeChangeStart', function(event, currRoute, prevRoute){
    // prevRoute.isFree tell me if this route is available for all the users, or only for registered user.
    // User.isLogged tell me if the user is logged
})

Я также написал об этом подходе (подробнее) в своем блоге, аутентификация пользователей с помощью angularjs.

прежде всего: данные на стороне клиента всегда можно манипулировать или подделывать.

до тех пор, пока действительные идентификаторы сеанса не могут быть легко угаданы, и такие меры, как связывание токенов сеанса с IP-адресом клиента, не имеют большого значения.

теоретически вы можете также зашифровать файл cookie, если вы делаете это на стороне сервера.

для получения подробной информации о том, как шифровать файлы cookie, см. документы на стороне сервера (например http://expressjs.com/api.html#res.cookie для экспресс.js)

вам нужно узнать о сервере / базе данных о нем.

логины пользователей должны храниться где-то-99,9% времени это в базе данных на стороне сервера.

В идеале для действительно безопасной системы вам нужна бэкэнд (серверная сторона) система членства, которая хранит сеанс в таблице базы данных, связанной с таблицей членов, которая содержит зашифрованный пароль, но также предоставляет интерфейс RESTful, где вы можете создавать свои вызовы api к.

один скрипт, который я использовал успешно много было Amember https://www.amember.com/. это действительно экономически эффективный способ пойти, хотя есть много других сценариев там, у меня было много успеха с этим.. Это также PHP, так что вы можете построить свою сборку API для ваших угловых http-вызовов очень легко.

все эти фреймворки javascript великолепны, но эффект заключается в том, что теперь слишком много внимания уделяется переднему концу вещи-изучите базу данных / бэкэнд, а также! : -)