当我在www.example.com中输入生成的令牌时,总是得到无效的签名。下面是生成令牌的代码jwt.io Here is my code for making the token
const secret = 'secret';
const token = jwt.sign({
username: user.username,
userID: user._id
},
secret, {
expiresIn: "1hr"
}
);
我做错了什么?
我正在使用jsonwebtoken包。https://github.com/auth0/node-jsonwebtoken
5条答案
按热度按时间72qzrwbm1#
如果你使用的是jsonwebtoken lib,我试过创建令牌并验证了,请看一下代码,如果你仍然面临这个问题,请在评论中告诉我。
这是www.example.com的链接jwt.io,我在这里输入了您使用的密码,它显示已验证。
https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IiIsInVzZXJJRCI6MSwiaWF0IjoxNTI4NTUyMDYyLCJleHAiOjE1Mjg1NTU2NjJ9.raL79zTGONyXgr9vuXzAyMflHJ0JqPYTXsy9KwmlXhA
km0tfn4u2#
TL_DR:
从
https://example.com/.well-known/jwks
返回的JSON中的keys
数组中提取第一个键,并将其粘贴到www.example.com页面的VERIFY SIGNATURE
部分的第一个文本框中jwt.io。当然,example.com
是您托管OpenIddict身份验证服务器的域。整个故事:
在www.example.com中粘贴JWT时jwt.io,它会执行以下操作:
1.解码令牌,并在右侧显示报头和有效负载
1.尝试验证签名
如果步骤1.无法解码有效负载,那是因为令牌被编码了。要解决这个问题,请修改OpenIddict配置,添加
.DisableAccessTokenEncryption();
步骤2(签名验证)是通过从
PAYLOAD
部分获取issueriss
字段来完成的:并将其用作调用
/.well-known/openid-configuration
的基本URI,/.well-known/openid-configuration
包括JWKSURI,该URI类似于"jwks_uri": "https://example.com/.well-known/jwks"
jwt.io 可能无法获取此数据,例如:
https://localhost
中进行测试,而https://localhost
无法从Internet访问,就像本例中的https://localhost:5001
一样如果是这种情况,有一个解决问题的选项:将适当的字符串粘贴到
VERIFY SIGNATURE
部分的上部文本框中,该文本框包含以下占位符:SPKI、PKCS #1、X.509证书或JWK字符串格式的公钥。
什么是正确的字符串粘贴在那里?这是很容易的,如果你考虑到2个细节:
1.您可以从前面提到的
https://example.com/.well-known/jwks
端点获取包含此信息的JSON1.返回的信息是JWKS字符串,但需要JWK。
因此,调用端点,获得JWKS,如下所示:
并提取JWK,它只是
"keys"
数组中的第一个条目,即将该值粘贴到文本框中,您将得到蓝色的“签名已验证”消息,正如您在第一个快照的底部看到的那样。
注意:根据配置(
AddEphemeralSigningKey()
、AddDevelopmentSigningCertificate()
等),JWKS键可以有更多或更少的属性,但无论如何它都应该工作。velaa5lx3#
我也有过类似的问题,后来我发现我用错了秘密
请确保使用正确的密码
ecr0jaav4#
在我的情况下,我忘了把我的密钥在“验证签名”(右手边,在“标题”和“有效载荷”框之后)。
suzh9iv85#
我也遇到了同样的问题。我在点击"Verify Signature" panel.内部的复选框“secret base64 encoded”后修复或验证了它