![](/img/trans.png)
[英]How to get OAuth token after Google One Tap sign in: JWT token response of one tap sign in to Google oAuth
[英]How to use one JWT token to sign a second JWT token?
场景:Web 应用程序用户想要创建私有资产的授权视图。 用户已通过身份验证并拥有 jwt 令牌。 该应用程序想要制作一个新的辅助 jwt 令牌,可以验证它是使用原始令牌创建的。
仅供参考:我的用例是签署 url - 将第二个 jwt 令牌添加到 url 中,以允许对私有资产进行受控的公开查看。
应用程序应该如何做到这一点?
例如,有没有推荐的方法来设置第二个令牌的secret
和alg
?
理论上,要使用一个 jwt 来签署另一个,您将使用 HS256 算法,其中第一个 jwt 作为秘密。 在实践中,这种方法会导致几个问题,概述如下:
首先,只有服务器和原始令牌持有者才能验证此令牌的真实性,为了让服务器执行验证,您需要将原始令牌保存在某个地方。 这不在您的问题的 scope 范围内,但它确实开始使实现复杂化,因为现在两个令牌必须共享一个生命周期,并且原始令牌需要在可能使用第二个令牌的任何地方都可用。 对于您的用例而言,这可能不是问题,但它确实在一定程度上限制了可移植性,以及例如,如果另一方需要验证令牌(通过使用 RS256 可以在没有太多开销的情况下实现这种用例)和非对称密钥,而不是 HS256/对称密钥方法)。
其次,JWT 通常是短暂的生命周期值。 这通常是由于它们的使用性质:由于它们在客户端和服务器之间共享,因此严格来说它们不是“秘密”值,并且它们存在的时间越长,它们被泄露的可能性就越大。 在将它们用作其他令牌的秘密材料时,您现在需要这些令牌的使用寿命更长,并且您可能会引入一个安全漏洞,其中“次要”令牌可能被攻击者欺骗,而攻击者获得了这些“主要”令牌之一“代币。 为了减轻这种特定的威胁,秘密材料应该是不通过网络传输的东西。
也许您可能会考虑对两个令牌使用相同的令牌生成过程(相同的算法和秘密),并简单地将“发行者”的标识符(持有原始令牌的用户的唯一标识符)作为第二个令牌的一部分。 使用这种方法,您无需担心对给定令牌使用哪个验证过程(因为现在两者都相同),也不必担心令牌寿命或通过被盗令牌进行的密钥欺骗。
我认为最好的答案是你不应该,至少不是在客户端。 如果你的意思是你的后端是节点或其他东西,你可以做这样的事情。
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.