繁体   English   中英

如何使用一个 JWT 令牌来签署第二个 JWT 令牌?

[英]How to use one JWT token to sign a second JWT token?

场景:Web 应用程序用户想要创建私有资产的授权视图。 用户已通过身份验证并拥有 jwt 令牌。 该应用程序想要制作一个新的辅助 jwt 令牌,可以验证它是使用原始令牌创建的。

仅供参考:我的用例是签署 url - 将第二个 jwt 令牌添加到 url 中,以允许对私有资产进行受控的公开查看。

应用程序应该如何做到这一点?

例如,有没有推荐的方法来设置第二个令牌的secretalg

理论上,要使用一个 jwt 来签署另一个,您将使用 HS256 算法,其中第一个 jwt 作为秘密。 在实践中,这种方法会导致几个问题,概述如下:

首先,只有服务器和原始令牌持有者才能验证此令牌的真实性,为了让服务器执行验证,您需要将原始令牌保存在某个地方。 这不在您的问题的 scope 范围内,但它确实开始使实现复杂化,因为现在两个令牌必须共享一个生命周期,并且原始令牌需要在可能使用第二个令牌的任何地方都可用。 对于您的用例而言,这可能不是问题,但它确实在一定程度上限制了可移植性,以及例如,如果另一方需要验证令牌(通过使用 RS256 可以在没有太多开销的情况下实现这种用例)和非对称密钥,而不是 HS256/对称密钥方法)。

其次,JWT 通常是短暂的生命周期值。 这通常是由于它们的使用性质:由于它们在客户端和服务器之间共享,因此严格来说它们不是“秘密”值,并且它们存在的时间越长,它们被泄露的可能性就越大。 在将它们用作其他令牌的秘密材料时,您现在需要这些令牌的使用寿命更长,并且您可能会引入一个安全漏洞,其中“次要”令牌可能被攻击者欺骗,而攻击者获得了这些“主要”令牌之一“代币。 为了减轻这种特定的威胁,秘密材料应该是不通过网络传输的东西。

也许您可能会考虑对两个令牌使用相同的令牌生成过程(相同的算法和秘密),并简单地将“发行者”的标识符(持有原始令牌的用户的唯一标识符)作为第二个令牌的一部分。 使用这种方法,您无需担心对给定令牌使用哪个验证过程(因为现在两者都相同),也不必担心令牌寿命或通过被盗令牌进行的密钥欺骗。

我认为最好的答案是你不应该,至少不是在客户端。 如果你的意思是你的后端是节点或其他东西,你可以做这样的事情。

  1. 让客户端发出经过身份验证的请求,让我访问资源 x。
  2. 服务器此时可以从原始令牌中获取任何信息来创建一个新的 JWT 令牌,数据如下。
  3. 使用您喜欢的任何方法签署 jwt服务器端(我总是使用带有证书的 RS256)。
  4. Respond the the client with, you can access the resource at protected/resource_x?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL3lvdXIud2ViLnNpdGUvcHJvdGVjdGV4L3Jlc291cmNlX3giLCJpc3MiOiJodHRwczovL3lvdXIud2ViLnNpdGUiLCJleHAiOjE2MTU4MTIyOTQ5ODMsInNjcCI6InByaXZhdGVfcmVzb3VyY2UiLCJzdWIiOiJvcmlnaW5hbC11c2VyLWlkLWZyb20tY2xpZW50LXRva2VuIn0.cga9CQ1IqUwzBRgYM3vlUN0g37yJWZREQQEExV29UWs

您的 jwt 可以包含以下信息:

{
  "aud": "https://your.web.site/protectex/resource_x",
  "iss": "https://your.web.site",
  "exp": 1615812294983,
  "scp": "private_resource",
  "sub": "original-user-id-from-client-token"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM