[英]How to verify a JWT signature using Node-jose
我正在尝试使用node-jose来验证我的 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
header? 我是否从该库的已知秘密中正确生成了密钥?
您的代码有两个问题。
由于 Promise 的异步特性,当 promise 完成时(在.then
部分中), key
会获得一个值,但这发生在调用下一行之后。
将console.log(key)
直接jose.JWK.asKey(...
行之后,您会看到结果是“未定义”。所以实际上没有键。
JWK 中的k
值被视为 Base64Url 编码的八位字节。 当您签署令牌时,您必须使用k
的 base64url 解码值,但不能直接使用k
。
要解决第一个问题,您可以嵌套调用(这很快就会变得难以阅读,或者在异步函数中构造代码,如下所示:
var jose = require('node-jose')
async function tokenVerifyer()
{
let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXJpYWxfbnVtYmVyIjoiNWYxMGExNjMtMjk2OC00ZDZkLWIyZDgtOGQxNjQwMDNlMmQ0Iiwic2VxIjo1MTI4MTYsIm5hbWUiOiJOYW1lMSIsImlkIjo2NTQsImRlc2NyaXB0aW9uIjoiVGVzdCBEZWNvZGluZyJ9.KK9F14mwi8amhsPT7ppqp_yCYwwOGcHculKByNPlDB8"
let props = {
kid: "test-key",
alg: "HS256",
use: "sig",
k: "cynZGe3BenRNOV2AY__-hwxraC9CkBoBMUdaDHgj5bQ",
kty: "oct"
}
let key = await getKey(props)
let result = await verify(token, key)
}
async function verify(token, key)
{
return await jose.JWS.createVerify(key).verify(token)
}
async function getKey(params)
{
return await jose.JWK.asKey(params)
}
tokenVerifyer()
In the above example, k
is a key generated on https://mkjwk.org/ and the token was created with that key on https://jwt.io (check 'secret base64 encoded')
我是否需要修改我的令牌以在某处包含孩子 header?
上面的小例子没有将kid
放入令牌中。 对于任何实际应用程序,您通常会将kid
添加到令牌 header 中。 您的密钥库可能有更多密钥或旋转密钥, kid
帮助 select 找到正确的密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.