NodeJS 始终在www.example.com中获取无效签名jwt.io

gijlo24d  于 2023-02-03  发布在  Node.js
关注(0)|答案(5)|浏览(199)

当我在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

72qzrwbm

72qzrwbm1#

如果你使用的是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);
        }
    });

这是www.example.com的链接jwt.io,我在这里输入了您使用的密码,它显示已验证。
https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IiIsInVzZXJJRCI6MSwiaWF0IjoxNTI4NTUyMDYyLCJleHAiOjE1Mjg1NTU2NjJ9.raL79zTGONyXgr9vuXzAyMflHJ0JqPYTXsy9KwmlXhA

km0tfn4u

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部分获取issuer iss字段来完成的:

并将其用作调用/.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端点获取包含此信息的JSON
1.返回的信息是JWKS字符串,但需要JWK。
因此,调用端点,获得JWKS,如下所示:

{
  "keys": [
    {
      "kid": "2727AC6EB83977...",
      "use": "sig",
      "kty": "RSA",
      "alg": "RS256",
      "e": "AQAB",
      "n": "6tSSW3rz53Xj3w...",
      "x5t": "Jyesbrg5d_2M...",
      "x5c": [
        "MIIC9TCCAd2gAwIBAgIJAKL..."
      ]
    }
  ]
}

并提取JWK,它只是"keys"数组中的第一个条目,即

{
  "kid": "2727AC6EB83977...",
  "use": "sig",
  "kty": "RSA",
  "alg": "RS256",
  "e": "AQAB",
  "n": "6tSSW3rz53Xj3w...",
  "x5t": "Jyesbrg5d_2M...",
  "x5c": [
        "MIIC9TCCAd2gAwIBAgIJAKL..."
   ]
}

将该值粘贴到文本框中,您将得到蓝色的“签名已验证”消息,正如您在第一个快照的底部看到的那样。
注意:根据配置(AddEphemeralSigningKey()AddDevelopmentSigningCertificate()等),JWKS键可以有更多或更少的属性,但无论如何它都应该工作。

velaa5lx

velaa5lx3#

我也有过类似的问题,后来我发现我用错了秘密
请确保使用正确的密码

ecr0jaav

ecr0jaav4#

在我的情况下,我忘了把我的密钥在“验证签名”(右手边,在“标题”和“有效载荷”框之后)。

suzh9iv8

suzh9iv85#

我也遇到了同样的问题。我在点击"Verify Signature" panel.内部的复选框“secret base64 encoded”后修复或验证了它

相关问题