当前位置: 首页 > 知识库问答 >
问题:

在基于令牌的身份验证中使用 Refesh 令牌是否安全?

赵灼光
2023-03-14

我正在构建一个基于令牌的身份验证(Node.js使用带有angular客户端的passport/JWT)。

用户输入凭证后,他将获得一个访问令牌,并在头中的每个请求中发送该令牌(头:bearer token)。

我不想每次他的访问令牌过期时都提示登录请求(我猜大约每天),我听说过刷新令牌。刷新令牌永不过期(或很少过期),并且能够无限期续订令牌。当访问令牌即将过期时,客户端可以通过发送刷新令牌来发送续订请求以获取新的访问令牌。

我不明白一些事情,我可能会错过一些东西:

>

  • 长期/永不过期的刷新令牌如何不会破坏具有短期访问令牌的安全性。

    饼干可以被偷走并使用到过期。令牌寿命很短,因此更安全,但如果我提供一个长期刷新令牌,我就失去了使用令牌的优势。

    注意:我知道刷新令牌是在初始登录时发送的,因此不能在每个请求中被欺骗,但如果它们在初始请求中被欺骗,它们就容易受到攻击。

  • 共有2个答案

    柳钟展
    2023-03-14

    我使用以下方法:

    表/索引:

      < li >用户表(只有用户id和所有与用户相关的元数据) < li>JWT表(三个字段:用户id、访问令牌、刷新令牌)

    认证流程

    1.当以前未经身份验证的用户登录时,颁发一个包含访问令牌和刷新令牌的JWT。更新JWT表中的刷新令牌以及user_id和访问令牌。

    2.确保 JWT 的过期时间对您的用户来说很小/很舒服。通常不到一个小时。

    4.当客户用JWT发出请求时

    a、 检查访问令牌的有效期。如果令牌尚未过期-

    b.如果访问令牌已过期,请在JWT表中查找user_id,并检查刷新令牌和访问令牌是否匹配,无论客户端提供了什么,

    如果是,则发出带有响应的新JWT,并将新的刷新令牌、访问令牌更新到JWT表中。

    如果否,则返回 401。客户端被迫要求用户然后登录。

    结束。

    总之,

    1.DB调用仅用于检查刷新令牌是否有效。

    2.该系统允许用户使用任意数量的JWT从任意数量的设备登录

    3.通过从JWT表中擦除与该用户相关的刷新令牌,所有与用户相关的JWT都可以失效,这可以做到,例如:当用户更改他/她的密码时。这实际上缩小了访问令牌/JWT的到期时间的妥协窗口。

    我相信这就是JWT背后的意图。数据库调用/用户的百分比取决于您的到期时间、用户通常在您的网站上的持续时间等。

    徐德海
    2023-03-14

    刷新令牌呈现在与访问令牌不同的路径上:访问令牌仅呈现给资源服务器,刷新令牌仅呈现给授权服务器。访问令牌可以是自包含的,因此它不需要对授权服务器进行昂贵的调用来检查其有效性,但是为了减少损失和增加准确性(在出错的情况下它不能被撤销),它是短暂的。刷新令牌是长期存在的,并且在每次调用授权服务器时都会得到验证,因此它可以被撤销。两者的结合使系统变得安全

     类似资料:
    • 我在身份验证中使用基于令牌的方法,但在许多博客中,我读到他们将令牌存储在数据库中。 我们需要将令牌存储在DB中的基于令牌的身份验证中吗? https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication 在这个博客中,提到我们正在签署令牌而不是存储在数据库中,我认为这应该是实现真正无状态的方法。

    • 问题内容: 我有一个REST API,我正在使用Spring Security基本授权进行身份验证,客户端会为每个请求发送用户名和密码。现在,我想实现基于令牌的身份验证,当用户最初通过身份验证时,我将在响应标头中发送令牌。对于进一步的请求,客户端可以在令牌中包含该令牌,该令牌将用于对资源进行用户身份验证。我有两个身份验证提供程序tokenAuthenticationProvider和daoAuth

    • 在daoAuthenticationProvider中,我设置了自定义userDetailsService并通过从数据库中获取用户登录详细信息对其进行身份验证(只要使用授权传递用户名和密码就可以正常工作:basic bgllqxbpvxnlcjogn21wxidmqjrdturtr04pag==作为头) 但是当我使用X-AUTH-TOKEN(即constants.auth_header_name)

    • 问题内容: 我正在PHP Lumen中构建一个应用程序,该应用程序在登录时会返回令牌。我不知道如何继续进行。 我应该如何使用这些令牌维护会话? 具体来说,如果我使用reactjs或原始HTML / CSS / jQuery,如何将令牌存储在客户端,并在我为Web应用程序的安全部分提出的每个请求中发送令牌? 问题答案: 我通常要做的是将令牌保留在本地存储中,这样即使用户离开站点,我也可以保留令牌。

    • 我正在PHP Lumen中构建一个应用程序,它在登录时返回令牌。我不知道如何继续。 我应该如何使用这些令牌维护会话? 具体来说,如果我使用reactjs或vanilla HTML/CSS/jQuery,我如何在客户端存储令牌,并在我为web应用程序的安全部分发出的每个请求中发送它们?

    • 我正在使用ASP.NET核心应用程序。我正在尝试实现基于令牌的身份验证,但无法确定如何使用新的安全系统。我查看了一些示例,但它们对我没有太大帮助,它们使用的是cookie身份验证或外部身份验证(GitHub、Microsoft、Twitter)。 我的场景是:angularjs应用程序应该请求url,传递用户名和密码。WebApi应该授权user并返回,angularjs应用程序将在以下请求中使用