1

我对 OAuth2 中的刷新令牌有点困惑。就像它说的访问令牌限制了黑客可以使用用户凭据的 1 小时时间窗口,并且刷新令牌是可用于重新创建访问令牌的长效令牌。

如果有人从 cookie 中窃取了访问令牌,我感到很困惑,他还可以窃取刷新令牌,并且可以使用刷新令牌来创建新的访问令牌,因为我在 JQuery(客户端)中有 ajax 请求

注意:我已经创建了 ajax 请求以在服务器端发送刷新令牌,我在此处附加了客户端 ID 和机密,并带有授权类型刷新令牌。

我已经在 cookie 中保存了访问令牌和刷新令牌,并使用 ajax 请求获取新的访问令牌

jQuery(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {

        //console.log('event');console.log(event);
        //console.log('jqXHR');console.log(jqXHR);
        //console.log('ajaxSettings');console.log(ajaxSettings);
        //console.log('thrownError');console.log(thrownError);

        if(jqXHR.status == 403)
        {
            console.log('User is not Loged in Redictet to Login Page');
        }   

        if(jqXHR.status == 401)
        {
            var refresh_token = Cookies.get('refresh_token');
            if(refresh_token != undefined)
            {
                $.ajax({
                        url: CONNECT_API_URL+'/refresh-token',
                        type: "POST",
                        data:{ refresh_token: refresh_token },
                        success: function(response, status, jqXHR){
                            if(response.access_token != undefined)
                            {
                                var expires_in = new Date(new Date().getTime() + response.expires_in * 1000);
                var access_token = response.token_type+' '+response.access_token;
                Cookies.set('access_token', access_token, { expires: expires_in });
                Cookies.set('refresh_token', response.refresh_token, { expires: 14 });
                                $.ajax(ajaxSettings); // Re send same ajax request with access token in cookie has been set
                            }
                            else
                            {
                                console.log('Redirect to login page.');
                            }
                        }, 
                 });    
            }
        }   


});

我应该如何使用刷新令牌来增强安全性?

4

1 回答 1

1

在这篇博客文章中,标题为刷新令牌:何时使用它们以及它们如何与 JWT 交互,您的问题中的主题得到了很好的讨论。

该帖子的引述:

刷新令牌通常受到严格的存储要求,以确保它们不会泄露。

RFC6819 规范中,他们编写了以下关于在客户端上存储访问令牌的内容:

5.1.6。访问令牌

应使用以下措施来保护访问令牌:

  • 将它们保存在临时内存中(只能由客户端应用程序访问)。
  • 使用安全传输 (TLS) 安全地传递令牌。
  • 确保客户端应用程序不与第三方共享令牌。

关于刷新令牌的发行:

5.2.2.1。限制发行刷新令牌

授权服务器可以基于适当的策略决定不发布刷新令牌。由于刷新令牌是长期凭证,它们可能会被盗。例如,如果授权服务器不信任客户端安全地存储此类令牌,​​它可能会拒绝向此类客户端颁发刷新令牌。

这意味着您可能应该仔细考虑要存储刷新令牌的位置。这篇文章在哪里存储您的 JWT – Cookie 与 HTML5 Web 存储正是针对这个主题。

正如在 StackOverflow 上的这个答案中也提到的那样,仅仅refresh_token获得一个新的access_token.

刷新令牌,如果被泄露,将毫无用处,因为攻击者除了刷新令牌之外还需要客户端 ID 和密码才能获得访问令牌。

这也可以在同一个RFC6819 规范中找到:

5.2.2.2。将刷新令牌绑定到“client_id”

授权服务器应该将每个刷新令牌与发出它的客户端的标识符相匹配。授权服务器应检查每个刷新访问令牌的请求是否存在相同的“client_id”。如果可能(例如,机密客户端),授权服务器应该验证相应的客户端。

这是针对刷新令牌盗窃或泄漏的对策。

刷新令牌只能使用一次。使用refresh_token时,它将返回一个新的access_token和一个新的refresh_token。它使旧的refresh_token无用意味着它不能再使用。

它还允许身份验证服务器识别 arefresh_token已被破坏,因为它应该只使用一次。如果身份验证服务器收到具有相同内容的新更新请求,则refresh_token知道发生了一些可疑的事情。不确定服务器处理这种情况的正确方法是什么......(也许其他人可以对此有所了解)

这也在RFC6819 规范中:

5.2.2.3。刷新令牌轮换

刷新令牌轮换旨在自动检测并防止尝试从不同的应用程序/设备并行使用相同的刷新令牌。如果令牌从客户端被盗并且随后被攻击者和合法客户端使用,就会发生这种情况。基本思想是在每次刷新请求时更改刷新令牌值,以便检测使用旧刷新令牌获取访问令牌的尝试。由于授权服务器无法确定攻击者或合法客户端是否正在尝试访问,因此在这种访问尝试的情况下,有效的刷新令牌和与之关联的访问授权都将被撤销。

OAuth 规范支持此措施,因为令牌的响应允许授权服务器返回新的刷新令牌,即使对于授予类型为“refresh_token”的请求也是如此。

注意:此措施可能会在集群环境中引起问题,因为必须确保使用当前有效的刷新令牌。在这样的环境下,其他措施可能更合适。

您的访问和刷新令牌可能会在客户端受到破坏,但令牌也可能在您的客户端和服务器之间的某处被截获。每次请求都将发送到服务器时,refresh_token它只发送一次给客户端access_token,这就是为什么中间人得到你的机会比你被入侵access_token的机会要大得多的原因。refresh_token

一般来说,最好完全理解 OAuth2 协议,以便您可以正确实施它。关于安全性,我简而言之:

  • 使用 JWT的第一个要求是在客户端和服务器之间正确配置 https 连接,以便所有令牌在来回发送时都得到正确加密。
  • 第二个要求是您以安全的方式将令牌存储在您的客户端上。

我希望这能让你对这个话题有所了解。如果有人想添加或更正我的帖子,请随时编辑/更新/赞美答案或发表评论。

于 2016-12-21T09:32:56.060 回答