【问题标题】:How to delete token on API error 401?如何删除 API 错误 401 上的令牌?
【发布时间】:2016-02-28 01:31:54
【问题描述】:

如果任何调用导致 401 错误,从服务器检测 $http 错误并删除令牌的最简单方法是什么?例如,如果会话在用户未使用应用程序时到期,则当他们返回 Web 应用程序时,令牌不再有效。如果我在 API 调用期间发回 401 错误,我需要注意这一点并让用户重新登录。

目前,在 Chrome 开发者工具中,我可以看到 401 错误,但 Satellizer 没有删除令牌(以为是一次删除)。

我尝试创建一个httpInterceptor,但收到Circular Dependency error

apiLogoutInterceptor.$inject = ['$q', '$auth'];
function apiLogoutInterceptor ($q, $auth) {
    var service = this;
    service.responseError = function (response) {
        if (response.status == 401) {
            $auth.removeToken();
            window.location = '/login';
        }
        return $q.reject(response);
    };
}

configureApiLogout.$inject = ['$httpProvider'];
function configureApiLogout ($httpProvider) {
    $httpProvider.interceptors.push('apiLogoutInterceptor');
}

【问题讨论】:

    标签: angularjs jwt satellizer


    【解决方案1】:

    您可以通过注入 $injector 服务并手动获取所需的依赖项来解决循环依赖项。举个例子,看这篇文章:AngularJS: Injecting service into a HTTP interceptor (Circular dependency)

    此外,我认为没有任何理由使用var service = this,因为它足以返回一个包含responseError 键的处理程序方法的简单对象,如下所示:

    function($injector, ...) {
      return {
        'responseError': function(err) { /* your handler logic */ }
      }
    }
    

    【讨论】:

    • 感谢您的链接。它帮助我解决了这个问题。我希望在 Satellizer 中有一种“官方”的方式来做到这一点。如果找不到,我将编辑我的问题、标题并接受答案,因为它有效。
    • 当您需要一个可以直接甚至间接访问 $http 的服务时(例如,通过 $state - 从路由),这是一个常见问题。您可以使用 $injector 服务或注入 $rootscope 并广播一个事件(这也打破了循环)。取决于我们更适合的用例。如果您无法修改需要调用的服务,则 $injector 将是您的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多