16

我正在寻找一种方法来做这两件事,首先,如果没有找到 SessionID,我想将用户重定向到登录页面,其次我想听听您关于仅在内存中持久化会话 ID(没有 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 变量中,并为每个请求将其发送到服务器。这是一种可行/安全的方法吗?你能给我一些想法吗?

谢谢!

4

4 回答 4

9

我使用了类似的策略(拦截来自服务器的 401 响应)。您可以在此处查看完整示例:https ://github.com/Khelldar/Angular-Express-Train-Seed

它在后端使用 node 和 mobgodb 进行会话存储,并在客户端使用精简的 http 拦截器,它不会像上面链接的 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);
于 2013-04-02T13:44:20.987 回答
8

我将从这里开始,Witold 创建了这个很酷的拦截器,它可以使用 http 响应。我使用它,它真的很有帮助。

于 2012-11-20T17:39:15.197 回答
2

就我而言,我用

  1. 带有 $httpProvider 的拦截器
  2. 配置
  3. 和 $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');  
    }
  ])
于 2014-12-30T00:40:12.110 回答
0

这会奏效。它在我的应用程序中运行良好

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);
    });
于 2016-05-27T12:45:42.830 回答