plu*_*m 0 5 javascript node.js jwt jwk 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)})
Run Code Online (Sandbox Code Playgroud)
我是否需要修改我的令牌以kid在某处包含标头?我是否根据该库的已知秘密正确生成密钥?
您的代码存在三个问题。
由于承诺的异步性质,key当承诺完成时(在部分中.then)会获取一个值,但这发生在调用下一行之后。
console.log(key)直接在该行后面放置一个jose.JWK.asKey(...,您会看到结果是“未定义”。所以实际上没有钥匙。
kJWK 中的值被视为 Base64Url 编码的八位字节。当您签署令牌时,您必须使用 的 base64url 解码值k,但不能k直接使用。
对于 node.jose 来说,秘密“SuperSecretKey”太短。对于 HS256 算法,秘密的长度必须为 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()
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,是在https://mkjwk.org/k上生成的密钥,并且令牌是使用https://jwt.io上的该密钥创建的(选中“秘密的 base64 编码”)。或者,您可以使用自己的秘密,但必须确保它足够长。
我是否需要修改我的令牌以在某处包含 child 标头?
上面的小示例无需将 放入kid令牌即可工作。对于任何实际应用程序,您通常会将其添加kid到令牌标头中。您的密钥库可能有更多密钥或旋转密钥,这kid有助于选择正确的密钥。