2016-12-01 5 views
3

Я ищу лучшее архитектурное решение.Угловая проверка подлинности JS

я следующий HTML:

<body ng-controller="individualFootprintController as $ctrl"> 
<div ng-hide="$ctrl.authenticated"> 
      <h1>Login</h1> 
      With Corporate Account: <a href="/login/corporate">click here</a> 
</div> 

И контроллер:

function individualFootprintController($http) { 
     var self = this; 
     $http.get("/is_auth").success(function() { 
      self.authenticated = true; 
     }) 
      .error(function() { 
       self.authenticated = false; 
      } 
     ); 
} 

Вопросы:

1) Является ли этот контроллер подходящее место для имея эту логику?

2) Я хочу иметь фактическое значение «is_authenticated». Как это может произойти, если я хочу подать запрос только один раз

ответ

0

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

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

  1. Вне зависимости от того, зарегистрирован ли вы или нет, следует ли использовать токен аутентификации или нет.
  2. Этот токен должен храниться в каноническом месте, наиболее подходящим для этого является услуга.
  3. Другие сервисы получают оттуда токен, а также определяют, действительно ли приложение «вошло в систему» ​​на основе доступности токена.

Грубый набросок того, как это должно быть структурировано:

app.service('AuthService', function() { 
    this.token = null; 
}); 

app.service('FooService', function (AuthService, $http) { 
    $http.get(..., AuthService.token, ...) 
}); 

app.controller('LoginStatusController', function (AuthService) { 
    Object.defineProperty(this, 'isLoggedIn', { 
     get: function() { return AuthService.token != null; } 
    }); 
}); 
<div ng-controller="LoginStatusController as ctrl"> 
    <div ng-hide="ctrl.isLoggedIn"> 

Когда вы на самом деле войти и получить маркер, вы установите AuthService.token и он будет доступен для всех других услуг и контроллеры. Если и когда токен становится недействительным или не установлен, все службы и контроллеры теряют свой аутентифицированный статус.

+0

Он использует аутентификацию печений. –

+0

И в сценарии jwt auth факт, что «у меня есть токен», не означает, что вы аутентифицированы. Аутентификация является гораздо более похожей на «мой токен действителен», который необходимо проверять часто. –

+0

Если токен неявный, ну, тогда замените его только флагом 'true' /' false'. И да, вы не узнаете, действителен ли ваш токен или нет, пока вы его не попробуете. Поэтому, когда он терпит неудачу, аннулируйте его. – deceze

0

То, что я обычно делаю следующее:

Использование ui-router

  • Воспользуйтесь resolve крючком (который устраняет некоторые арг и ввести их в контроллер), а также определить свои маршруты, подпрограммы основного, который проверяет auth при каждом изменении маршрута

    скрипты/услуги/user.js

    angular.module('yourmodule') 
        .service('userSrv', function ($http, $q) { 
        var srv = {}; 
    
        srv.getAuthenticatedUser = function() { 
         return $http.get("/authenticated_user"); 
        }; 
    
        return srv; 
        }); 
    

    сценарии/маршруты.JS

    angular 
    .module('yourmodule') 
    .config(function ($stateProvider) { 
        $stateProvider 
        .state('authenticated', { 
         abstract: true, 
         template: '<ui-view />', 
         controller: 'AuthenticatedCtrl', 
         resolve: { 
         signedInUser: function(userSrv, $q) { 
          return userSrv.getAuthenticatedUser() 
          .then(function(null, function() { 
          //Catch any auth error, likely 403 
          //And transform it to null "signedInUser" 
          //This is the place to handle error (log, display flash) 
          return $q.resolve(null); 
          }); 
         } 
         } 
        }) 
        .state('authenticated.myspace', { 
         url: '/myspace', 
         templateUrl: 'views/myspace.html' 
        }); 
    }); 
    
  • Воспользоваться $ области видимости наследования внутри вашей точки зрения

    скрипты/контроллеры/authenticated.js

    angular.module('yourmodule') 
        .controller('AuthenticatedCtrl', function (signedInUser, $scope, $state) { 
        //Here you set current user to the scope 
        $scope.signedInUser= signedInUser; 
    
        $scope.logout = function() { 
        //this is where you would put your logout code. 
        //$state.go('login'); 
        }; 
    }); 
    

    просмотров/myspace.html

    <!-- here you call parent state controller $scope property --> 
    <div ng-hide="signedInUser"> 
        <h1>Login</h1> 
        With Corporate Account: <a href="/login/corporate">click here</a> 
    </div> 
    

1) Я хочу иметь фактическое значение «is_authenticated». Как это может произойти, если я хочу отправить запрос только один раз Мое решение запрашивает аутентифицированного пользователя при каждом изменении маршрута. Это кажется странным, но это актуально и быстро. Запрос не должен быть> 30 мс, это очень маленький SELECT под капотом. МЫ, спрашивая: «Я аутентифицирован» и «получить аутентифицированного пользователя», - это одно и то же, за исключением того, что один возвращает логическое значение, а другой возвращает пользователя. Я предлагаю, как только я вам показать, обработать вопрос «я аутентифицирован», запросив аутентифицированного пользователя, а затем выучить его «if (user)» (обработка нулевого значения).

2) Является ли этот контроллер подходящим местом для этой логики? Да и нет. Как вы можете видеть, контроллер - это самое место, чтобы «установить пользователя в область видимости», но наследование объектов позволяет вам не повторять его для каждого маршрута. Хотя, http api логика должна быть портирована на службу, и событие маршрутизации («получить аутентифицированный пользователь для этой страницы, пожалуйста» является событием маршрутизации IMHO) следует установить в отдельный файл.

NB: если вам нужен полный маршрут «защита» (например, перенаправление на не прошедших проверку подлинности, задать другой вопрос, и я буду рад ответить на него)

Смежные вопросы