Подтвердить что ты не робот

Как обрабатывать аутентификацию в приложении Angular JS

Я использую систему auth в моем приложении angular js.

Что я планирую, как показано ниже:

  • Получить информацию о пользователе (имя и пароль из формы входа)
  • Проверьте, существует ли пользователь или нет
  • Если сервер отвечает на запросы cookie сеанса, а интерфейс будет перенаправлен на определенную страницу.
  • тогда пользователь выполнит некоторую задачу, которая будет генерировать запрос API
  • Запрос API должен содержать информацию cookie, которая была отправлена ​​на шаге 3
  • сервер проверить, был ли cookie сгенерирован или нет, и если cookie был найден, тогда ответьте на результаты запроса API. И в моем служении я делаю что-то вроде
    MyApp.service('myAuth', function($http, $q) {
        this.authHeader = null;
        this.checkAuth = function(){
        //do api call and if success sets this.authHeader = response
        }
        this.isAuthenticaed = function(){
            this.authHeader ? return this.authHeder  : return false;
       }

После отправки формы входа я вызову checkAuth и верну свой файл cookie с моего сервера, как я могу добавить информацию о файлах cookie при выполнении следующего вызова REST, а также когда пользователь будет перемещаться по всему приложению после входа в систему. Я хочу проверять каждый раз isAuthenticaed true или false, в Angularjs, когда он перейдет на другую страницу, сбрасывает ли он после установки его истины с первого вызова? И мой подход 1-6 хорош или у вас есть какие-то конкретные предложения? Кстати, я проверил предыдущие записи, но это не то, что я хочу знать.

4b9b3361

Ответ 1

Я не уверен в вашем бэкэнде, но вот как я это сделаю

  • Создайте отдельную страницу входа (выделенный url не angular sub view или модальный диалог).
  • Если пользователь не аутентифицирован, перенаправляется на этот логин стр. Это делается перенаправлением сервера. Эта страница может использовать или не использовать angular, поскольку он просто включает в себя отправку пользователя \password для сервер.
  • Сделайте запрос POST (не AJAX) на странице входа и проверьте на сервере.
  • На сервере установите auth cookie. (Различные структуры делают это по-другому. ASP.Net устанавливает форму cookie для проверки подлинности.)
  • После аутентификации пользователя перенаправляет пользователя в действительное приложение angular и загружает все его компоненты.

Это позволяет сохранить любой код для управления аутентификацией на стороне клиента в Angular. Если пользователь приземлился на эту страницу, он аутентифицирован и имеет файл cookie.

Также поведение браузера по умолчанию заключается в том, чтобы отправлять все куки, связанные с доменом, с каждым запросом, поэтому вам не нужно беспокоиться, если angular отправляет некоторый файл cookie или нет.

Ответ 2

Я использую http-auth-перехватчик. http://ngmodules.org/modules/http-auth-interceptor

В моем backend (asp.net mvc) я создаю простую службу аутентификации и возвращаю http-ошибку 401, если пользователь не аутентифицирован. Затем я обрабатываю ошибку с видом входа в сайт SPA.

Ответ 3

Идеи, изложенные в предыдущих ответах, будут работать, но я думаю, что они переборщились. Вам не нужно ничего такого сложного.

как я могу добавить информацию cookie при следующем вызове REST

Включите withCredentials по умолчанию внутри $httpProvider следующим образом:

app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
}]);

Затем удалите шаблон (если он у вас есть) из заголовков, связанных с CORS, и установите учетные данные разрешений на стороне сервера. В моем случае, используя Python + Flask + Flask-Restful, он очень прост и выглядит следующим образом:

import Flask
from flask_restful import Api
app = Flask(__name__)
api = Api(app)
api.decorators = [cors.crossdomain(origin='http://localhost:8100', credentials=True)]

Теперь cookie будет установлен и автоматически передан браузером автоматически и прозрачно. См. Эти темы для получения дополнительной информации:

когда пользователь будет перемещаться по всему приложению после входа в систему. Я хочу каждый раз проверять isAuthenticaed true или false

Как было предложено выше, верните сервер 401, если сеанс аутентификации истекает или удаляется, и используйте $httpInterceptor в Angular, чтобы поймать его так:

app.config(function($httpProvider) {
    var interceptor =
        function($q, $rootScope) {
            return {
                'response': function(response) {
                    return response;
                 },
                'responseError': function(rejection) {
                    if (rejection.status==401) {
                        // Modify this part to suit your needs.
                        // In my case I broadcast a message which is
                        // picked up elsewhere to show the login screen.
                        if (!rejection.config.url.endsWith('/login'))
                        {
                            $rootScope.$broadcast('auth:loginRequired');
                        }
                    }

                    return $q.reject(rejection)
                 }
            }
        };

    $httpProvider.interceptors.push(interceptor);
});

Ответ 4

(раскрытие: я являюсь одним из разработчиков UserApp)

Для этого вы можете использовать сторонний сервис UserApp вместе с модуль AngularJS.

Ознакомьтесь с руководством по началу работы или выберите курс на Codecademy. Вот несколько примеров того, как это работает:

  • Форма входа с обработкой ошибок:

    <form ua-login ua-error="error-msg">
        <input name="login" placeholder="Username"><br>
        <input name="password" placeholder="Password" type="password"><br>
        <button type="submit">Log in</button>
        <p id="error-msg"></p>
    </form>
    

    Доступ к информации о пользователе осуществляется с помощью службы user: user.current.email

    Или в шаблоне: <span>{{ user.email }}</span>

  • Регистрация формы с обработкой ошибок:

    <form ua-signup ua-error="error-msg">
        <input name="first_name" placeholder="Your name"><br>
        <input name="login" ua-is-email placeholder="Email"><br>
        <input name="password" placeholder="Password" type="password"><br>
        <button type="submit">Create account</button>
        <p id="error-msg"></p>
    </form>
    

    ua-is-email означает, что имя пользователя совпадает с именем электронной почты.

  • Как указать маршруты, которые должны быть общедоступными, и какой маршрут является формой входа в систему:

    $routeProvider.when('/login', {templateUrl: 'partials/login.html', public: true, login: true});
    $routeProvider.when('/signup', {templateUrl: 'partials/signup.html', public: true});
    

    Маршрут .otherwise() должен быть установлен в том месте, где вы хотите, чтобы ваши пользователи были перенаправлены после входа в систему. Пример:

    $routeProvider.otherwise({redirectTo: '/home'});

  • Выход из системы:

    <a href="#" ua-logout>Log Out</a>

  • Скрыть элементы, которые должны отображаться только при входе в систему:

    <div ng-show="user.authorized">Welcome {{ user.first_name }}!</div>

Чтобы аутентифицировать ваши внутренние службы, просто используйте user.token(), чтобы получить токен сеанса и отправить его с помощью запроса AJAX. В фоновом режиме используйте UserApp API, чтобы проверить, действителен ли токен.

Если вам нужна помощь, просто дайте мне знать:)