首页 文章

OAUTH2刷新令牌

提问于
浏览
1

我在OAuth2中很少混淆Refresh Token . 就像它说访问令牌限制黑客可以使用用户凭证的1小时的时间窗口和刷新令牌是可以用来重新创建访问令牌的长实时令牌 .

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

NOTE: 我已经创建了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.');
                            }
                        }, 
                 });    
            }
        }   


});

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

1 回答

  • 1

    在这篇 Headers 为Refresh Tokens: When to Use Them and How They Interact with JWTs的博客文章中,您可以很好地讨论您的问题中的主题 .

    该帖子引用:

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

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

    5.1.6 . 访问令牌应使用以下措施来保护访问令牌:将它们保存在瞬态内存中(仅可由客户端应用程序访问) . 使用安全传输(TLS)安全地传递令牌 . 确保客户端应用程序不与第三方共享令牌 .

    关于刷新令牌的发布:

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

    这意味着您应该仔细考虑要存储刷新令牌的位置 . 这篇文章Where to Store your JWTs – Cookies vs HTML5 Web Storage正好涉及这个主题 .

    正如前面提到的那样in this answer on StackOverflow只有 refresh_token 不足以获得新的 access_token .

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

    这也可以在同一个_2709278中找到:

    5.2.2.2 . 刷新令牌绑定到“client_id”授权服务器应将每个刷新令牌与发布它的客户端的标识符相匹配 . 授权服务器应检查每个刷新访问令牌的请求是否存在相同的“client_id” . 如果可能(例如,机密客户端),授权服务器应该验证相应的客户端 . 这是针对刷新令牌被盗或泄漏的对策 .

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

    它还允许身份验证服务器识别 refresh_token 已被泄露,因为它应该只使用一次 . 如果验证服务器中出现了具有相同 refresh_token 的新续订请求,则知道存在可疑的情况 . 不知道服务器处理这种情况的正确方法是什么......(也许其他人可以对此有所了解)

    这也在_2709285中:

    5.2.2.3 . 刷新令牌轮换刷新令牌轮换旨在自动检测并防止尝试从不同的应用程序/设备并行使用相同的刷新令牌 . 如果令牌从客户端被盗并随后被攻击者和合法客户端使用,则会发生这种情况 . 基本思想是使用每个刷新请求更改刷新令牌值,以便检测使用旧刷新令牌获取访问令牌的尝试 . 由于授权服务器无法确定攻击者或合法客户端是否正在尝试访问,因此在这种访问尝试的情况下,有效刷新令牌和与其关联的访问授权都被撤销 . OAuth规范支持此措施,因为令牌的响应允许授权服务器返回新的刷新令牌,即使对于具有授权类型“refresh_token”的请求也是如此 . 注意:此度量可能会在群集环境中导致问题,因为必须确保使用当前有效的刷新令牌 . 在这样的环境中,其他措施可能更合适 .

    您的访问权限和刷新令牌可以在客户端受到攻击,但令牌也可能在客户端和服务器之间的某个地方被截获 . refresh_token 只发送一次到客户端,而每次请求都会将 access_token 发送到服务器,这就是为什么一个中间人接触你的 access_token 的机会远大于你的机会 . refresh_token 遭到入侵 .

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

    • 使用JWT的 first demand 是客户端和服务器之间正确配置的https连接,以便在来回发送时对所有令牌进行适当加密 .

    • A second demand 是您在客户端以安全的方式存储令牌 .


    我希望这能为您提供有关此主题的一些见解 . 如果有人想添加或更正我的帖子,请随时编辑/更新/补充答案或发表评论 .

相关问题