首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Node-jose验证JWT签名

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

Stack Overflow用户
提问于 2021-12-28 15:26:26
回答 1查看 2.9K关注 0票数 2

我正在尝试使用节点-何塞来验证我的JWT的签名。我知道这个秘密,但是我很难把这个秘密转换成一个用于验证的JWK。

下面是一个例子,说明我如何尝试用我的秘密创建我的密钥并验证我的令牌。这导致了Error: no key found

代码语言:javascript
复制
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头包含在某个地方?我是否从这个图书馆的已知秘密中正确地生成了密钥?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-28 17:20:06

您的代码有三个问题。

  1. 由于承诺的异步性质,key在履行承诺时(在.then部分中)得到一个值,但是在调用下一行之后会发生这种情况。 将console.log(key)直接放在行jose.JWK.asKey(...之后,您就会看到结果是“未定义”。所以实际上没有钥匙。
  2. JWK中的k值被视为Base64Url编码的八进制。在对令牌进行签名时,必须使用base64url解码的k值,而不是直接使用k
  3. 秘密"SuperSecretKey“对node.jose来说太短了。对于HS256算法,秘密必须是256位长。与其他语言相比,node.jose似乎相当严格。

要解决第一个问题,可以嵌套调用(这些调用很快变得难以读取),或者使用如下所示的异步/等待语法:

代码语言:javascript
复制
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帮助选择正确的键。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70509112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档