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

Javascript 如何使用一个JWT令牌来签署第二个JWT令牌?,javascript,authentication,web-applications,jwt,Javascript,Authentication,Web Applications,Jwt,场景:web应用程序用户希望创建私人资产的授权视图。用户已通过身份验证并拥有jwt令牌。该应用程序希望创建一个新的辅助jwt令牌,可以验证该令牌是使用原始令牌创建的 仅供参考:我的用例是签署一个url——将第二个jwt令牌添加到url中,以允许对私有资产进行受控的公开查看 应用程序应该如何做到这一点 例如,是否有一种推荐的方法来为第二个令牌设置secret和alg。在实践中,这种方法会导致以下几个问题: 首先,只有服务器和原始令牌持有者能够验证该令牌的真实性,为了让服务器执行验证,您需要将原始令

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

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

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


例如,是否有一种推荐的方法来为第二个令牌设置
secret
alg
。在实践中,这种方法会导致以下几个问题:

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

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


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

理论上,要使用一个jwt对另一个jwt进行签名,您将使用HS256算法,第一个jwt作为秘密。在实践中,这种方法会导致以下几个问题:

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

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


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

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

  • 让客户机发出经过身份验证的请求,让我访问资源x
  • 此时,服务器可以从原始令牌中获取任何信息来创建一个新的JWT令牌,其中包含以下数据
  • 使用您喜欢的任何方法对jwt服务器端进行签名(我总是使用带证书的RS256)
  • 向客户回复:,您可以访问以下位置的资源:
    protected/resource_x?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyjdwqioijodhrwczovl3lvdxiud2vilnnpdguvchjvgvg4jl3jlcjpc3miojhodhhrwczovl3lvd3lvd2vilc2jc91cmnlx3giljjc3gic3gic3miojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj3mijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj我>
    您的jwt可以包含以下信息:

    {
    “澳元”:https://your.web.site/protectex/resource_x",
    “国际空间站”:https://your.web.site",
    “经验”:1615812294983,
    “scp”:“privat