angularjs - 委托(delegate)刷新 token 获取新JWT的基本策略

标签 angularjs authentication single-page-application jwt

我在实现 Angular SPA 和 JWT 方面做得很好,但我总是很难委派一个新的 token 。

我的基本策略是:

  • 在 auth 拦截器中获取 Auth Error = > Delegate with refresh token,替换 JWT,否则注销

  • 这不起作用,因为会触发多个异步调用并且一个会获得委托(delegate)函数,但随后刷新 token 将用于第二个并且该 token 将失败,然后用户将被注销。
  • 首先:检查 token 过期,如果过期 => 使用刷新 token 委托(delegate),替换 jwt,否则注销

  • 其中有一个类似的问题,第一次调用会注意到它已过期,然后去获取新的 token ,但由于它是异步的,其余的调用会触发并失败等。

    这里的基本策略是什么。我觉得应用程序应该做的第一件事是检查 JWT 并委托(delegate)一个新的 token ,如果它是一个坏 token ,但在这种情况下它不应该是异步的。我只是不删除使用中的刷新 token 吗?

    任何帮助都会很棒,我觉得这是我理解的最后一个重大漏洞。谢谢!

    最佳答案

    尝试使用 Witold Szczerba's "http interceptor" .

    简而言之,第一个失败的 http 调用触发器和事件以及后续调用被推送到一个数组中。在事件触发时,您有机会执行一些逻辑,然后重播失败的调用。

    也就是说,您可能应该在需要实际使用刷新 token 之前进行 token 轮换。例如考虑这个可以添加到 this function 的代码。

    .config(function($httpProvider) {
        $httpProvider.interceptors.push(function(moment, $rootScope, $q, httpBuffer) {
            return {
                request: function (config) {
                    if ($rootScope.authToken) {
                        config.headers["Authentication"] = 'Bearer ' + $rootScope.authToken;
                        var payload = angular.fromJson(atob($rootScope.authToken.split('.')[1]));
                        var utcNow = moment.utc().valueOf();
                        // 3600000 ms = 1 hr
                        if(utcNow > payload.iat + 3600000){
                            $rootScope.$broadcast('auth:rotateToken', $rootScope.authToken);
                        }
                    }
    
                    return config;
                },
                //responseError: ...see Witold's code...
        });
    })
    

    关于angularjs - 委托(delegate)刷新 token 获取新JWT的基本策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34234018/

    相关文章:

    javascript - AngularJS - 使用指令调用回调函数?

    security - session 固定 - 登录后删除 session 并创建新 session - 但用户不再登录

    javascript - 使用 Nodejs Web 服务器但没有框架对用户进行身份验证

    javascript - Angular Controller 有什么意义, Controller 的工作不能由指令完成吗?

    javascript - AngularJs UI 路由器中的“/' is not letting the state to pass to '/{用户名 :[a-zA-Z0-9]{3, 20}}”

    javascript - 具有真实 URL 的单页应用程序

    c# - OWIN 为多个路由发送静态文件

    javascript - 加载 json 数据的函数应该放在哪里?

    javascript - AJAX 中的 Promise 和 Success 之间的区别

    node.js - 在 Node.js 项目中存储通用身份验证详细信息的可靠方法是什么?