gpt4 book ai didi

javascript - 如何使用 Node-jose 验证 JWT 签名

转载 作者:行者123 更新时间:2023-12-05 03:32:10 48 4
gpt4 key购买 nike

我正在尝试使用 node-jose验证我的 JWT 的签名。我知道 secret ,但无法将此 secret 转换为用于验证的 JWK。

这是一个示例,说明我如何尝试使用我的 secret 创建我的 key 并验证我的 token 。这会导致 错误:找不到 key

let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXJpYWxfbnVtYmVyIjoiNWYxMGExNjMtMjk2OC00ZDZkLWIyZDgtOGQxNjQwMDNlMmQ0Iiwic2VxIjo1MTI4MTYsIm5hbWUiOiJOYW1lMSIsImlkIjo2NTQsImRlc2NyaXB0aW9uIjoiVGVzdCBEZWNvZGluZyJ9.ahLaTEhdgonxb8rfLG6NjcIg6rqbGzcHkwwFtvb9KTE"
let secret = "SuperSecretKey"
let props = {
kid: "test-key",
alg: "HS256",
use: "sig",
k: secret,
kty: "oct"
}
let key;
jose.JWK.asKey(props).then(function(result) {key = result})
jose.JWS.createVerify(key).verify(token).then(function(result){console.log(result)})

我是否需要修改我的 token 以在某处包含 kid header ?我是否根据该库的已知 secret 正确生成了 key ?

最佳答案

您的代码存在三个问题。

  1. 由于 promise 的异步性质,key 在 promise 完成时(在 .then 部分)获得一个值,但那发生在之后调用下一行。

    console.log(key) 直接放在 jose.JWK.asKey(... 行之后,您会看到结果是“undefined”。所以实际上没有 key 。

  2. JWK 中的 k 值被视为 Base64Url 编码的八位字节。签署 token 时,必须使用 k 的 base64url 解码值,但不能直接使用 k

  3. secret “SuperSecretKey”对于 node.jose 来说太短了。对于 HS256 算法, key 长度必须为 256 位。与其他库相比,node.jose 似乎相当严格。

要解决第一个问题,您可以嵌套调用(这很快就会变得难以阅读,或者使用如下所示的 async/await 语法:

var jose = require('node-jose')

async function tokenVerifyer()
{
let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXJpYWxfbnVtYmVyIjoiNWYxMGExNjMtMjk2OC00ZDZkLWIyZDgtOGQxNjQwMDNlMmQ0Iiwic2VxIjo1MTI4MTYsIm5hbWUiOiJOYW1lMSIsImlkIjo2NTQsImRlc2NyaXB0aW9uIjoiVGVzdCBEZWNvZGluZyJ9.KK9F14mwi8amhsPT7ppqp_yCYwwOGcHculKByNPlDB8"
let secret = "SuperSecretKeyThatIsLongEnough!!" // A 32 character long secret to get 256 bits.
let props = {
kid: "test-key",
alg: "HS256",
use: "sig",
k: "cynZGe3BenRNOV2AY__-hwxraC9CkBoBMUdaDHgj5bQ",
//k : jose.util.base64url.encode(secret), // alternatively use above secret
kty: "oct"
}

let key = await jose.JWK.asKey(props)

let result = await jose.JWS.createVerify(key).verify(token)
}

tokenVerifyer()

在上面的示例中,k 是在 https://mkjwk.org/ 上生成的 key token 是在 https://jwt.io 上使用该 key 创建的(选中“ secret base64 编码”)。或者,您可以使用自己的 key ,但必须确保它足够长。

Do I need to modify my token to include the kid header somewhere?

上面的小例子没有将 kid 放入 token 中。对于任何实际应用程序,您通常会将 kid 添加到 token header 中。您的 keystore 可能有更多 key 或轮换 key ,kid会帮助选择正确的 key 。

关于javascript - 如何使用 Node-jose 验证 JWT 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70509112/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com