在 jwt.io 中总是得到无效的签名

新手上路,请多包涵

当我在 jwt.io 中输入生成的令牌时,我总是得到无效的签名 这是我制作令牌的代码

const secret = 'secret';
const token = jwt.sign({
    username: user.username,
    userID: user._id
  },
  secret, {
    expiresIn: "1hr"
  }
);

我做错了什么?

我正在使用 jsonwebtoken 包。 https://github.com/auth0/node-jsonwebtoken

原文由 thegreathypocrite 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

这是 jwt.io 的链接,我在其中输入了您使用的密码,上面写着已验证。

https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IiIsInVzZXJJRCI6MSwiaWF0IjoxNTI4NTUyMDYyLCJleHAiOjE1Mjg1NTU2NjJ9.raL79zMKflhAJHZA

在此处输入图像描述

原文由 Suresh Prajapati 发布,翻译遵循 CC BY-SA 4.0 许可协议

TL_DR:

从—返回的JSON中的 https://example.com/.well-known/jwks keys 数组中提取第一个key,粘贴到j.j.page的 VERIFY SIGNATURE wt-io-page部分的第一个文本框中。当然, example.com 是您托管 OpenIddict 身份验证服务器的域。也可能类似于 https://example.com/my/auth/server/jwt.io接口

整个故事:

当您将 JWT 粘贴到 jwt.io 时,它会执行以下操作:

  1. 解码令牌,并在右侧显示标头和有效负载
  2. 尝试验证签名

如果第 1 步无法解码有效负载,那是因为令牌已编码。要解决此问题,请修改 OpeIddict 配置,添加 .DisableAccessTokenEncryption();

第 2 步,签名验证,是通过从 PAYLOAD 部分获取发行 iss 字段来完成的: 在此处输入图像描述

并将其用作调用 /.well-known/openid-configuration 的基本 URI,其中包括 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 字符串格式的公钥。

那里的正确字符串是什么?如果您考虑到 2 个细节,这很容易:

  1. 您可以从上述 https://example.com/.well-known/jwks 端点获取包含此信息的 JSON
  2. 返回的信息是 JWKS 字符串,但需要 JWK。

因此,调用 enpoint,获取如下所示的 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 键可以有更多或更少的属性,但无论如何它应该工作。

原文由 JotaBe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题