繁体   English   中英

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

[英]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? 我是否从该库的已知秘密中正确生成了密钥?

您的代码有两个问题。

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

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

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM