Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地实现Json Web令牌(JWT)?_Jwt - Fatal编程技术网

如何有效地实现Json Web令牌(JWT)?

如何有效地实现Json Web令牌(JWT)?,jwt,Jwt,我试图实现并利用JWT(jsonweb令牌)来保护我的系统。我得到了JWT的部分是防篡改的。我参加了很多关于如何安全地实现JWT的讨论,但我还是有点困惑 首先,我决定使用2个令牌(刷新令牌和访问令牌) 刷新令牌将具有更长的生存期,并用于维护日志会话和创建访问令牌。它是在用户首次登录时创建的,并在用户每次主动使用应用程序时刷新其到期日期,这样,如果用户正在主动使用我的应用程序,则无需重新登录 访问令牌将是短期的,我正在尝试为每种特定请求创建访问令牌。因此,第二个问题是 (1) 我应该创建单个访问令

我试图实现并利用
JWT(jsonweb令牌)
来保护我的系统。我得到了JWT的部分是防篡改的。我参加了很多关于如何安全地实现JWT的讨论,但我还是有点困惑

首先,我决定使用2个令牌(刷新令牌和访问令牌)

  • 刷新令牌将具有更长的生存期,并用于维护日志会话和创建访问令牌。它是在用户首次登录时创建的,并在用户每次主动使用应用程序时刷新其到期日期,这样,如果用户正在主动使用我的应用程序,则无需重新登录
  • 访问令牌将是短期的,我正在尝试为每种特定请求创建访问令牌。因此,第二个问题是
  • (1) 我应该创建单个访问令牌还是按照我认为应该使用的方式创建 不同类型请求的不同访问令牌

    我的逻辑流程如下所示:

    A) 用户使用有效用户名和密码登录==>服务器验证参数,成功后创建刷新令牌(RT)并将RT发送回用户

    B) 用户在访问我的服务器中受保护的api时,首先发送刷新令牌(RT),如果有效的服务器发送回访问令牌(AT)以访问该api

    C) 用户向受保护的api发送访问令牌,验证成功后,根据需要将受保护的资源发回给用户

    (2) 但我还是觉得我缺少一些安全方面的东西 视野。比如,如果其他人获得刷新令牌,他们可以创建访问令牌,对吗

    (3) 同样,通过实现(B),这里甚至需要访问令牌 及(三)


    我将非常感谢您的帮助。

    如果一个糟糕的参与者获得了刷新令牌,他们将无法创建和签署新令牌,但他们可以在可预见的未来延长当前令牌的使用寿命。显然,这会带来安全风险——如果你想冒这个风险,这取决于你自己

    在您描述的流程的某个点期间,您将需要一个访问令牌

    您可以忘记一起支持刷新令牌。如果一个坏演员得到一个刷新令牌,要阻止他造成伤害是非常困难的

    我建议创建一种访问令牌,并使用它来授予对服务器上资源的访问权。您可以采取以下策略:

    您的身份验证服务器将需要是微服务的JWT的单一颁发者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发出使用私钥签名的JWT(签名必须是非对称的-RS256是一个示例),您只保留在身份验证服务器上;不要将此私钥提供给您希望在其中验证JWT的其他微服务。您可以做的是基于您用其签名令牌的私钥派生公钥,并将其发布到auth服务器上不需要身份验证的端点-公钥将以a的形式表示(请参阅指向规范的链接)。谷歌也做了类似的事情。然后,在每个微服务中,您需要设计一种方法,每X分钟向auth服务器上的公钥端点发出GET请求,并在每个微服务中缓存公钥

    然后,每当一个请求进入一个微服务时,您就获取JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的好处在于,您可以仅基于公钥验证令牌,但不能对其进行签名。因此,只要每个服务都有来自/cert端点的公钥,它们就可以验证令牌,而无需与身份验证服务器通信或知道私钥

    这将需要更多的前期工作,但将为您带来大量的方便、灵活性和安心,因为只有一个来源知道您的私钥

    如果您的实现是Java的,我建议使用库进行JWT验证

    整个体系结构最终将看起来像这样:


    但如果我不使用刷新令牌,如何让用户保持登录状态。由于访问令牌被设置为短寿命。一旦访问令牌过期,您只需提示用户重新验证或再次登录即可。这对用户来说是一个小小的不便,但减少了安全漏洞。这是一个折衷方案,我愿意接受。谢谢你,但我宁愿不按我的要求。