OAUTH2刷新令牌

时间:2016-12-06 10:45:11

标签: php oauth-2.0 zend-framework2 apigility refresh-token

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

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

注意:我已经创建了ajax请求以在服务器端发送刷新令牌我使用grant type refresh token附加了Client ID和Secret。

我已在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 个答案:

答案 0 :(得分:1)

在这篇标题为Refresh Tokens: When to Use Them and How They Interact with JWTs的博客文章中,我们很好地讨论了您问题中的主题。

该帖子引用:

  

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

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

  

<强> 5.1.6。访问令牌

     

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

     
      
  • 将它们保存在瞬态内存中(可由客户端访问)     仅限申请)。
  •   
  • 使用安全传输(TLS)安全传递令牌。
  •   
  • 确保客户端应用程序不与第3个共享令牌     方。
  •   

关于刷新令牌的发布:

  

<强> 5.2.2.1。限制发布刷新令牌

     

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

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

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

  

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

也可以在同一RFC6819 spec

中找到
  

<强> 5.2.2.2。刷新令牌绑定到&#34; client_id&#34;

     

授权服务器应该将每个刷新令牌匹配到      发给它的客户的标识符。授权      服务器应检查相同的&#34; client_id&#34;每个人都有      请求刷新访问令牌。如果可能(例如,保密)      客户端),授权服务器应该验证相应的      客户端。

     

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

刷新令牌只能使用一次。使用refresh_token后,它会返回新的access_token和新的refresh_token。它使旧的refresh_token无用,意味着它无法再使用。

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

这也在RFC6819 spec

  

<强> 5.2.2.3。刷新令牌轮换

     

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

     

OAuth规范支持此措施,即令牌      响应允许授权服务器返回新的刷新      即使对于具有授权类型&#34; refresh_token&#34;。

的请求,也可以使用令牌      

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

您的访问和刷新令牌可能会在客户端受到攻击,但令牌也可能在您的客户端和服务器之间的某处被截获。 refresh_token仅向客户端发送一次,而每次请求都会将access_token发送到服务器,这就是为什么中间人可能会抓住您的access_token { {1}}比refresh_token遭受入侵的机会大得多。

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

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

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