JWT实施不适用于angul js

时间:2016-05-06 09:49:42

标签: angularjs jwt

我在我的angular js应用程序上实现了JWT。我添加了所有http函数的jwt授权密钥。我的代码是:

angular.module('IttadishopServices', [])
    .config(function Config($httpProvider, jwtInterceptorProvider) {
        jwtInterceptorProvider.tokenGetter = function (User) {
            var jwt = localStorage.getItem('id_token');
            if (localStorage.getItem("id_token") === null) {
                User.generateToken().success(function (data) {
                    localStorage.setItem('id_token', data);
                    return data;
                });

            } else {
                return jwt;
            }
        }
        $httpProvider.interceptors.push('jwtInterceptor');

    });

现在问题是,标题上添加了授权密钥。但是每个请求都会发送到服务器。我试图以多种方式添加该授权密钥,但每次每个请求都向服务器发送一个请求时,一个请求使用授权密钥,另一个请求没有任何授权密钥。添加了控制台的屏幕截图。

Console image for duplicate request

1 个答案:

答案 0 :(得分:0)

问题是你没有在你的截取器中返回一个promise,而你正在拦截器中使用异步函数。因此,在$ q中包装asynch函数并返回一个promise将解决发送请求2次的问题。有一次没有等待异步函数完成(没有键)和一次解析User.generateToken()的承诺。包装

angular.module('IttadishopServices', [])
    .config(function Config($httpProvider, jwtInterceptorProvider) {
        jwtInterceptorProvider.tokenGetter = function (User) {
            var jwt = localStorage.getItem('id_token');
            if (localStorage.getItem("id_token") === null) {
                var deferred = $q.defer();
                User.generateToken().success(function (data) {
                    localStorage.setItem('id_token', data);
                    deferred.resolve(data);
                });
                return deferred.promise;
            } else {
                return jwt;
            }
        }
        $httpProvider.interceptors.push('jwtInterceptor');
    });

但是你不应该在配置块中定义该功能,而应该在工厂中定义。

来源: http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/