如何在 node.js 中更改 jsonwebtoken 的标头

Posted

技术标签:

【中文标题】如何在 node.js 中更改 jsonwebtoken 的标头【英文标题】:How to change header of a jsonwebtoken in node.js 【发布时间】: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 我也遇到了同样的问题,请问您可以发布您的自定义令牌创建者代码吗? 【参考方案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.问题是如何删除我回答的类型标题。所以请。删除您对我的回答的毫无根据的陈述。你的整个答案,基本上只是一个代码答案,没有添加任何新内容。

以上是关于如何在 node.js 中更改 jsonwebtoken 的标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 中更改 jsonwebtoken 的标头

如何在node.js中更改格式日期

如何更改 node.js 中 process.env.PORT 的值?

如何更改node.js中soap包生成的xml?

如何使用node.js更改同一文件夹中的所有文件和文件夹权限

如何使用 docker 中的卷同步 node.js 工作区更改