我正在尝试使用节点-何塞来验证我的JWT的签名。我知道这个秘密,但是我很难把这个秘密转换成一个用于验证的JWK。
下面是一个例子,说明我如何尝试用我的秘密创建我的密钥并验证我的令牌。这导致了Error: no key found。
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)})我是否需要修改我的令牌以将kid头包含在某个地方?我是否从这个图书馆的已知秘密中正确地生成了密钥?
发布于 2021-12-28 17:20:06
您的代码有三个问题。
key在履行承诺时(在.then部分中)得到一个值,但是在调用下一行之后会发生这种情况。
将console.log(key)直接放在行jose.JWK.asKey(...之后,您就会看到结果是“未定义”。所以实际上没有钥匙。k值被视为Base64Url编码的八进制。在对令牌进行签名时,必须使用base64url解码的k值,而不是直接使用k。要解决第一个问题,可以嵌套调用(这些调用很快变得难以读取),或者使用如下所示的异步/等待语法:
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/上生成的密钥,令牌是用该密钥在https://jwt.io上创建的(检查“机密base64编码”)。或者,你可以使用你自己的秘密,但必须确保它足够长。
我是否需要修改我的令牌,以便在某个地方包含孩子的标题?
上面的小示例在不将kid放入令牌的情况下工作。对于任何实际应用程序,通常都会将kid添加到令牌头中。您的密钥库可能有更多的键或旋转的键,而kid帮助选择正确的键。
https://stackoverflow.com/questions/70509112
复制相似问题