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

Posted

技术标签:

【中文标题】Angularjs - 未在 Safari 中添加授权标头【英文标题】:Angularjs - Authorization header not added in Safari 【发布时间】:2014-05-06 22:54:24 【问题描述】:

我目前正在使用 Django + Django Rest Framework (DRF) 在后面构建一个 webapp,并使用 Angularjs 来构建 UI。

所有请求都使用内置在 DRF 中的基本令牌身份验证进行身份验证。我在 Angular 中实现了一个基本的拦截器,以将登录后存储在会话存储中的令牌添加到每个请求。这在 Google Chrome(我可以看到 Authorization 标头实际上是使用检查器添加到每个请求中)和 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'
            
        );
]);

如果尝试将 withCredentials 添加到 getByUserId 方法但没有成功。

我的拦截器被正确推送到 $httpService。我已验证该令牌在 Safari 的 sessionStorage 中可用。我已将令牌从拦截器打印到控制台。无法解决这个问题。

有人吗?

【问题讨论】:

我想我有完全相同的问题,但使用 java 作为后端:( ***.com/questions/32018621/… 【参考方案1】:

终于偶然发现了这个烦人问题的解决方案。事实证明,这实际上与 Angularjs 如何删除 url 中的尾部斜杠以及 Django 如何需要这些斜杠来执行其魔法有关。

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

希望对您有所帮助。

【讨论】:

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

以上是关于Angularjs - 未在 Safari 中添加授权标头的主要内容,如果未能解决你的问题,请参考以下文章

带有内部图像的 Svg 未在 Safari 中显示

.NET C# 会话变量未在 Safari 浏览器中更新

HTML 表单按钮值未在 Safari 和 Chrome 中发布

链接样式未在 Safari 上显示

Javascript 提示未在 ipad 上扩展

React-Intl:消息未在 Safari 中格式化