AngularJS - перенаправление на страницу входа и сохранение идентификатора сеанса - программирование
Подтвердить что ты не робот

AngularJS - перенаправление на страницу входа и сохранение идентификатора сеанса

Я ищу способ сделать эти две вещи, сначала я хочу перенаправить пользователя на страницу входа в систему, если не найден 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 и для каждого запроса отправить его на сервер. Является ли это жизнеспособным/безопасным подходом? Можете ли вы дать мне несколько идей для этого?

Спасибо!

4b9b3361

Ответ 1

Я бы начал здесь, Витольд создал этот классный перехватчик, который работает с ответами на http. Я использую его, и это очень полезно.

Ответ 2

Я использую аналогичную стратегию (перехват 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);

Ответ 3

В моем случае я использовал

  • перехватчик с $httpProvider
  • конфигурации
  • и $window, так как $location просто добавляет путь к существующему URL-адресу. То, что произошло, было похоже на " http://www.tnote.me/#/api/auth", и оно должно получиться как " http://www.tnote.me/auth"

Фрагмент кода выглядит следующим образом.

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');  
    }
  ])

Ответ 4

это сработает. Он отлично работает в моем приложении

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);
    });