OAUTH2刷新令牌

我对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.');
                            }
                        }, 
                 });    
            }
        }   


});

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


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

该帖子的引用:

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

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

5.1.6。 访问令牌

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

  • 将它们保存在瞬态内存中(仅可由客户端应用程序访问)。
  • 使用安全传输(TLS)安全地传递令牌。
  • 确保客户端应用程序不与第三方共享令牌。
  • 关于刷新令牌的发布:

    5.2.2.1。 限制发行刷新令牌

    授权服务器可以根据适当的策略决定不发布刷新令牌。 由于刷新令牌是长期凭据,因此可能会被盗用。 例如,如果授权服务器不信任客户机安全地存储这些令牌,它可能会拒绝向这样的客户机发出刷新令牌。

    这意味着您应该仔细考虑在哪里存储刷新令牌。 这篇文章在哪里存储您的JWT - Cookie与HTML5网络存储正好处理这个话题。

    正如在StackOverflow的这个答案中所提到的,只有refresh_token不足以获得新的access_token

    刷新令牌(如果受到攻击)无用,因为除了刷新令牌外,攻击者还需要客户端ID和密钥才能获得访问令牌。

    这也可以在相同的RFC6819规范中找到:

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

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

    这是防止刷新令牌被盗或泄漏的对策。

    刷新令牌只能使用一次。 当使用refresh_token ,它将返回一个新的access_token和一个新的refresh_token 。 它呈现旧的refresh_token无用的含义,它不能再使用。

    它还允许身份验证服务器识别出refresh_token已被泄露,因为它只能使用一次。 如果认证服务器中有一个具有相同refresh_token的新的更新请求,则知道发生了一些可疑的事情。 不知道服务器处理这种情况的正确方法是什么,尽管......(也许别人可以对此发出一些启示)

    这也在RFC6819规范中:

    5.2.2.3。 刷新令牌旋转

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

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

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

    您的访问和刷新令牌可能会在客户端受到威胁,但令牌也可能会在您的客户端和服务器之间的某处被截获。 refresh_token只发送一次给客户端,而access_token被发送到每个请求的服务器,这就是为什么一个中间人抓住你的access_token的机会远远大于你的机会refresh_token被泄露。

    通常,完全理解OAuth2协议是很好的,以便您可以正确实现它。 关于安全性,我会简单地说:

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

  • 我希望这给你一些关于这个话题的见解。 如果有人想添加或更正我的文章,请随时编辑/更新/赞扬答案或留下评论。

    链接地址: http://www.djcxy.com/p/47963.html

    上一篇: OAUTH2 Refresh Token

    下一篇: What is the purpose of a "Refresh Token"?