16

これら 2 つのことを行う方法を探しています。まず、SessionID が見つからない場合にユーザーをログイン ページにリダイレクトしたいと思います。次に、セッション ID をメモリのみに保持する (Cookie を使用しない) ことについてご意見をお聞きしたいと思います。

リダイレクトのために思いついた解決策は次のとおりです。

1 - SessionID が存在するかどうかを確認し、存在しない場合はログイン ページにリダイレクトする OAuth というサービスを作成します。このサービスは、ログインおよびログアウト メソッドも担当します。

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 サービスを挿入し、ユーザーがログインしているかどうかを確認します

app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) {

    //check if user is logged
    OAuth.isLoggedIn();

}]);

質問:

1 - isLoggedIn() メソッドはすべてのコントローラーで呼び出されるため、サービスを注入して各コントローラーで呼び出すことなくこれを行う方法があるかどうか疑問に思います。

2 - sessionID を保存する Cookie を使用する代わりに、OAuth の _SessionID 変数に保存し、リクエストごとにサーバーに送信します。これは実行可能/安全なアプローチですか? そのためのアイデアを教えてください。

ありがとう!

4

4 に答える 4

8

ここから始めましょう。Witold は、http 応答で動作するこのクールなインターセプターを作成しました。私はそれを使用し、それは本当に役に立ちました。

于 2012-11-20T17:39:15.197 に答える
2

私の場合、私は使用しました

  1. $httpProvider を使用したインターセプター
  2. 構成
  3. $location は既存の URL にパスを追加しただけなので、$window の依存関係。何が起こったかは " 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 に答える