the*_*ite 8 node.js express jwt
当我在 jwt.io 中输入生成的令牌时,我总是得到无效的签名这是我制作令牌的代码
const secret = 'secret';
const token = jwt.sign({
username: user.username,
userID: user._id
},
secret, {
expiresIn: "1hr"
}
);
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
我正在使用 jsonwebtoken 包。https://github.com/auth0/node-jsonwebtoken
Jot*_*aBe 33
TL_DR:
keys从 返回的 JSON 数组中提取第一个键,并将其粘贴到jwt.io 页面部分https://example.com/.well-known/jwks的第一个文本框中。VERIFY SIGNATURE当然,example.com是您托管 OpenIddict 身份验证服务器的域。也可能是类似的东西https://example.com/my/auth/server/。

整个故事:
当您将 JWT 粘贴到 jwt.io 时,它会执行以下操作:
如果步骤 1. 无法解码有效负载,那是因为令牌已被编码。要解决此问题,请修改 OpenIddict 配置,添加.DisableAccessTokenEncryption();
第 2 步(签名验证)是通过iss从PAYLOAD以下部分获取颁发者字段来完成的:

并使用它作为基本 URI 来调用/.well-known/openid-configuration,其中包括 JWKS uri,如下所示
"jwks_uri": "https://example.com/.well-known/jwks"
jwt.io 可能无法获取此数据,例如:
https://localhost,无法从互联网访问,就像https://localhost:5001本示例中的如果是这种情况,有一个选项可以解决该问题:将适当的字符串粘贴到该部分的上部文本框中VERIFY SIGNATURE,其中包含以下占位符:
SPKI、PKCS #1、X.509 证书或 JWK 字符串格式的公钥。
粘贴到那里的正确字符串是什么?如果您考虑到两个细节,这很容易:
https://example.com/.well-known/jwks您可以从上述端点获取包含此信息的 JSON 因此,调用 enpoint,获取 JWKS,如下所示:
{
"keys": [
{
"kid": "2727AC6EB83977...",
"use": "sig",
"kty": "RSA",
"alg": "RS256",
"e": "AQAB",
"n": "6tSSW3rz53Xj3w...",
"x5t": "Jyesbrg5d_2M...",
"x5c": [
"MIIC9TCCAd2gAwIBAgIJAKL..."
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
并提取 JWK,它只是"keys"数组中的第一个条目,即
{
"kid": "2727AC6EB83977...",
"use": "sig",
"kty": "RSA",
"alg": "RS256",
"e": "AQAB",
"n": "6tSSW3rz53Xj3w...",
"x5t": "Jyesbrg5d_2M...",
"x5c": [
"MIIC9TCCAd2gAwIBAgIJAKL..."
]
}
Run Code Online (Sandbox Code Playgroud)
将此值粘贴到文本框中,您将收到蓝色的“签名已验证”消息,如第一个快照底部所示。
注意:根据配置(AddEphemeralSigningKey()、AddDevelopmentSigningCertificate()等),JWKS 键可以具有更多或更少的属性,但无论如何它都应该起作用。
Sur*_*ati 10
如果您使用的是jsonwebtoken lib,我尝试并能够创建令牌并进行验证。请查看代码,如果您仍然遇到问题,请在评论中告诉我。
var jwt = require('jsonwebtoken')
const secret = 'secret';
const token = jwt.sign({
username: "",
userID: 1
},
secret, {
expiresIn: "1hr"
},
function(err, token) {
if (err) {
console.log(err);
} else {
console.log(token);
}
});
Run Code Online (Sandbox Code Playgroud)
这是 jwt.io 的链接,我在其中输入了您使用的秘密,并说已验证。