如何重置AngularJS中的全局基本身份验证标头?

时间:2016-01-14 07:43:48

标签: angularjs http-headers

在我的角度应用中,为每个请求定义了全局$http标头,如下所示:

function useBasicAuth(username, hash) {
    var encoded = btoa(username + ':' + hash);
    $http.defaults.headers.common.Authorization = 'Basic ' + encoded;
}

如何禁用发送此信息,例如用户注销,并且不再需要身份验证?

1 个答案:

答案 0 :(得分:1)

我发现的工作解决方案是重新声明$http.defaults.headers.common对象,因此它不会包含标题。

示例:

function useBasicAuth(username, hash) {
    var encoded = btoa(username + ':' + hash);
    $http.defaults.headers.common.Authorization = 'Basic ' + encoded;
}

但是,这不会从浏览器中删除缓存的凭据。为了解决这个问题,我做了一个简单的 - 并且异步调用来有意地生成一个错误的请求。

这是我的accountServices工厂的功能:

function checkAuth(username, hash) {
    var encoded = btoa(username + ':' + hash);
    var result = false;

    $.ajax({
        type: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", 'Basic ' + encoded);
        },
        url: "user/current",
        statusCode: {
            401: function () {
                result = false;
            },
            200: function (response) {
                result = response;
            }
        },
        async: false
    });

    return result;
}

要将用户注销,我会调用此函数:

function useBasicWithoutAuth() {
    accountServices.checkAuth('logout','logout');
    $http.defaults.headers.common = {Accept: "application/json, text/plain, */*"};

}

所以这样做,是它首先向受保护的URL发送请求,使用假的和不存在的用户,所以它基本上是相同的,就好像你会看到提示,并且你点击取消。

完成此操作后,浏览器中没有缓存数据,我们可以简单地从Angular中删除标题,因此它不会发送任何Authorization信息,而不需要它。