委托刷新令牌获取新JWT的基本策略

Posted

技术标签:

【中文标题】委托刷新令牌获取新JWT的基本策略【英文标题】:Basic strategy for delegate refresh token to get new JWT 【发布时间】:2016-03-17 23:38:20 【问题描述】:

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

我的基本策略是:

    在身份验证拦截器中获取身份验证错误 => 使用刷新令牌进行委托,替换 JWT,否则注销

这不起作用,因为会触发多个 Async 调用,其中一个会获取委托函数,但随后刷新令牌将用于第二个,并且该令牌将失败,然后用户将被注销。

    在其他任何事情之前:检查令牌过期,如果过期 => 使用刷新令牌委托,替换 jwt,否则注销

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

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

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

【问题讨论】:

查看github.com/caolan/async 【参考方案1】:

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

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

也就是说,您可能应该在需要实际使用刷新令牌之前进行令牌轮换。例如考虑这个可以添加到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...
    );
)

【讨论】:

以上是关于委托刷新令牌获取新JWT的基本策略的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + OAuth + JWT + MySQL 刷新令牌第二次不起作用

使用 Angular 和 JWT 令牌持续登录

使用带有 JWT Auth/Laravel 的 Angular JS 获取新的刷新令牌后,如何恢复/重新发送请求?

哪种 JWT 刷新策略更安全?

在 Passportjs 中刷新 JWT 令牌

为啥使用 JWT 刷新令牌