如何在 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 标头与他们等待的内容进行比较......我只是建立了一个令牌步骤逐步使用Buffer
和crypto
所以我得到了我想要的标题并且它可以工作,但我仍然想知道如何设置标题,因为我们应该能够通过文档来做到这一点
服务器端的行为真的很奇怪。那么您可能必须使用您的自定义解决方案。
@BobTheDuckLing 我也遇到了同样的问题,请问您可以发布您的自定义令牌创建者代码吗?
【参考方案1】:
jwt.sign()
函数会创建一个像这样的默认标头:
"alg": <algorithm>,
"typ": "JWT"
如果存在header
参数,则会根据参数创建一个包含附加键/值对的标头。如果参数包含 typ
或 alg
的不同值,则将采用参数中的值。而且,正如 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 中 process.env.PORT 的值?