Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs-未在Safari中添加授权标头_Javascript_Django_Angularjs_Safari_Django Rest Framework - Fatal编程技术网

Javascript Angularjs-未在Safari中添加授权标头

Javascript Angularjs-未在Safari中添加授权标头,javascript,django,angularjs,safari,django-rest-framework,Javascript,Django,Angularjs,Safari,Django Rest Framework,我目前正在构建一个webapp,在后面使用Django+Django Rest框架(DRF)和Angularjs构建UI 所有请求都使用DRF中内置的基本令牌身份验证进行身份验证。我在Angular中实现了一个基本的拦截器,将令牌添加到每个请求中,该令牌在登录后存储在会话存储中。这在GoogleChrome(我可以看到授权头实际上是使用inspector添加到每个请求中)和Firefox中运行良好。但是,在Safari中,头不会添加到某些请求中 首先,这是我使用的拦截器: app.factory

我目前正在构建一个webapp,在后面使用Django+Django Rest框架(DRF)和Angularjs构建UI

所有请求都使用DRF中内置的基本令牌身份验证进行身份验证。我在Angular中实现了一个基本的拦截器,将令牌添加到每个请求中,该令牌在登录后存储在会话存储中。这在GoogleChrome(我可以看到授权头实际上是使用inspector添加到每个请求中)和Firefox中运行良好。但是,在Safari中,头不会添加到某些请求中

首先,这是我使用的拦截器:

app.factory('authInterceptor', ['$rootScope', '$q', '$window', function($rootScope, $q, $window){
    return {
        // This method adds the authentication token to each requests' header
        request: function(config){
            config.headers = config.headers || {};

            // add authentication token in header
            try {
                var token = $window.sessionStorage.token;
            } catch(err){
                token = undefined;
            }
            if(token !== undefined){
                config.headers.Authorization = 'Token ' + token;
            }
            return config;
        },
        response: function(response){
            if(response.status === 401){
                // user not authenticated
            }
            return response || $q.when(response);
        }
    };
}]);
在Safari中让我头疼的一个具体资源是:

app.factory('Coach', ['$resource', '$rootScope',
    function($resource, $rootScope){
        return $resource(
            $rootScope.api_url + 'api/coaches/:coachId/?format=json',
            {
                coachId: '@id'
            }
            ,
            {
                getByUserId: {method:'GET', url: $rootScope.api_url + 'api/coaches', isArray:false},
                update: {method:'PUT'}
            }
        );
}]);
如果您尝试向getByUserId方法添加withCredentials,但没有成功

我的拦截器被正确地推送到$httpService。我已经验证了sessionStorage中Safari中的令牌可用。我已将令牌从拦截器打印到控制台。我对这个问题没什么头绪


有人吗?

终于找到了这个恼人问题的解决办法。事实证明,这实际上与Angularjs如何删除url中的尾部斜杠以及Django如何需要这些斜杠来发挥其魔力有关

由于删除了角的尾部斜杠,服务器以301(永久移动)响应。Django Rest框架然后将请求重定向到正确的url(包括尾部斜杠)。但是,由于IE和Safari中的某些原因,身份验证令牌没有传递到第二个请求中。这就是你的问题


希望这能有所帮助。

我爱你,巴特。我爱你,谢谢克雷格,太好了。你有类似的问题吗?是的,但是有一个主干插件。我的服务器响应正常-200,我有这个问题:(请参阅我的问题:删除尾随斜杠我知道这是一个老问题,但我遇到了完全相同的问题。您是否找到了解决方案,或者只是手动确保在请求之前附加尾随斜杠?我想我有完全相同的问题,但使用java作为后端:(