javascript - 如何在 angular.js 中使用 token 管理身份验证?

标签 javascript angularjs angularjs-scope access-token restful-authentication

大家好,我创建了一个带有 token 身份验证的 RESTful API(Rails 4 + Devise),我还使用 gem(rack-cors) 管理 CORS 实现,但现在我想将 API 与 angular.js 一起使用

为此,我这样做:

var app = angular.module('models');

app.factory('Session',['$resource',function($resource){
    var Session = $resource(
        'http://api.creositios.dev/sessions/:id',
        {},
        {
            create: { method: 'POST'},
            delete: { method: 'DELETE', params: { id: '@id'} }
        }
    );
    return Session;
}]);  

这是我的 Controller

app = angular.module('controllers');

app.controller('SessionCtrl',['$scope','Session',function($scope,Session){

  $scope.new_session =  function(){
    $scope.session = Session.create({email: 'd<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="65001300090a1500174b0f0c08000b001f250208040c094b060a08" rel="noreferrer noopener nofollow">[email protected]</a>', password: '12345678'});
  };

}]);

到目前为止,我的实现没有遇到任何问题。我的问题是不知道如何管理返回我工厂的 token 。

使用 Angular.js 管理用户 token 并在 Angular.js 的不同 Controller 中验证用户的良好做法是什么?

这是我的第一个使用 token 进行身份验证的应用程序。非常感谢您的建议!.

最佳答案

常见的做法是将安全逻辑放入服务中,并使用 httpInterceptor 在请求中设置 token 。

安全服务。

angular.module('security')
    .factory('Security', ['$http', function ($http) {

        var token;

        function login(email, password) {
            return $http.post('/auth/login', {email: email, password: password})
                .then(function (response) {

                    if (response.data.token) {
                        token=response.data.token;
                    }
                });
        }

        function getToken(){
            return token;
        }

        return {
            login:login,
            token:getToken
        };     
}]);

这个特定的登录方法可以由登录 Controller 使用,例如:当用户登录时,返回的 token 被存储。

现在您可以使用拦截器将 token 添加到所有 http 请求

    .factory('authorizationInterceptor', ['Security', function (Security) {
        return {
            request: function (config) {
                var token=Security.getToken();
                config.headers = config.headers || {};
                if (token) {
                    config.headers.Authorization = 'Bearer ' + token;
                }
                return config;
            }
        };
    }]);

引导应用程序时,不要忘记添加拦截器

        .config(['$httpProvider',function ($httpProvider) {
            $httpProvider.interceptors.push('authorizationInterceptor');
        }]);

现在, token 将在每个 http 请求上设置,如果失败,您将如何处理取决于您。

例如,您可以添加另一个响应拦截器,如果得到 401 或 403 响应,则重定向到登录页面等

关于javascript - 如何在 angular.js 中使用 token 管理身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26748106/

相关文章:

javascript - 如何访问模板内的 Angular 1.5 组件属性

angularjs - 如何删除angular js中找不到文件的错误

javascript - $scope.$apply 会降低性能

javascript - 如何在 angular-ui 中选择一个选项卡? ( Angular )

angularjs - 在 Angular 中测试 e2e,最佳实践

javascript - 在 Electron 中加载本地html文件的简单方法

javascript - 需要 cssSandpaper.js 帮助吗?

angularjs - Angular 视差 - jquery 到 Angular

javascript - 数据表 Colvis 响应式

javascript - AngularJS 警报上的 ng-show