【问题标题】:How to change header of a jsonwebtoken in node.js如何在 node.js 中更改 jsonwebtoken 的标头
【发布时间】:2018-12-11 16:52:41
【问题描述】:

我需要一个令牌来对服务器进行身份验证,我正在使用 jsonwebtoken ,但它只有在令牌的标头是

时才有效
{
  "alg": "RS256"
}

而不是

{
  "alg": "RS256",
  "typ": "JWT"
}

并且jsonwebtoken 默认标题是第二个,我尝试按照此处https://github.com/auth0/node-jsonwebtoken 的说明将标题设置为选项,但是没有示例所以也许我做错了,但noTimestamp 选项正在工作所以... 文档中有这一行“可以通过 options.header 对象自定义标题。” ,我认为我不明白这一点。

jwt.sign(payload,
      pvtKey,
      { algorithm: 'RS256', noTimestamp : true, header: {"alg": "RS256"} }, function(err, token) {
        if (err) {
          return res.status(500).send("Error1: "+ err);
        }
        console.log("Created token: " + token);
      });

但它并没有改变任何东西,所以如果有人知道如何设置标题?

提前致谢

【问题讨论】:

  • 为什么它不适用于存在 typ 标头?会导致什么问题?
  • 它回答我令牌无效,服务器正在等待这个标头,所以我认为他们只是将 base64 标头与他们等待的内容进行比较......我只是建立了一个令牌步骤逐步使用Buffercrypto 所以我得到了我想要的标题并且它可以工作,但我仍然想知道如何设置标题,因为我们应该能够通过文档来做到这一点
  • 服务器端的行为真的很奇怪。那么您可能必须使用您的自定义解决方案。
  • @BobTheDuckLing 我也遇到了同样的问题,请问您可以发布您的自定义令牌创建者代码吗?

标签: node.js express oauth-2.0 jwt


【解决方案1】:

jwt.sign() 函数会创建一个像这样的默认标头:

{
  "alg": <algorithm>,
  "typ": "JWT"
}

如果存在header 参数,则会根据参数创建一个包含附加键/值对的标头。如果参数包含 typalg 的不同值,则将采用参数中的值。而且,正如 Atul 的回答中提到的,如果您将值设置为undefined,您还可以摆脱标准标头。 在下面的示例中,我通过设置 undefined 来删除 typ 键并添加一个额外的键 x

jwt.sign(payload, pvtKey,
    { algorithm: 'RS256', noTimestamp : true, header: {"typ": undefined, "x":"y"} })

结果是这个标题:

{
  "alg": "RS256",
  "x": "y"
}

结论:它有效,您可以自定义标题并删除标准值(正如 Atul 在他们的回答中指出的那样)

【讨论】:

    【解决方案2】:

    如果您想从标题中删除默认值 你也可以只设置 undefined

    例如:

    jwt.sign({ "hello": "world" }, key, { algorithm: "none", header: { typ: undefined } })
    

    产生一个具有

    的jwt

    有效载荷:

    {
      "hello": "world",
      "iat": 1627481195
    }
    

    和签名

    {
      "alg": "none"
    }
    

    【讨论】:

      【解决方案3】:
      var h  = {"alg":"PS256", "typ":"unknown", "kid":"5FZT6gTLM5wEoSGn3eW0Q8zCPsQ"};
      var i  = 'ClientId';   
      var s  = 'ClientId';   
      var a  = 'bla';
      var signOptions = {
       issuer:  i,
       header:  h,
       subject:  s,
       audience:  a,
       expiresIn:  "1h"
      };
      
      var token = jwt.sign(payload, privateKEY, signOptions);
      

      这个标题的结果:

      {
        "alg": "PS256",
        "typ": "unknown",
        "kid": "5FZT6gTLM5wEoSGn3eW0Q8zCPsQ"
      }
      

      【讨论】:

      • 你说,我的回答是错误的。那么,我回答错了哪个(部分)问题。你的答案在哪里给出了(希望是)正确答案?
      • 您可以更改算法。看例子。
      • 感谢您的回复。请再次阅读问题和我的答案。 1. OP 没有询问 alg 标头。 2.我没说不能改。我什至说你可以覆盖它。 3.问题是如何删除我回答的类型标题。所以请。删除您对我的回答的毫无根据的陈述。你的整个答案,基本上只是一个代码答案,没有添加任何新内容。
      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多