在 javascript 中为 JWT 生成 JTI 声明
Posted
技术标签:
【中文标题】在 javascript 中为 JWT 生成 JTI 声明【英文标题】:Generating JTI claim for JWT in javascript 【发布时间】:2019-03-29 00:51:15 【问题描述】:我之所以问这个问题,是因为一位同事已经为此困扰了几天。问题是,他试图在他的 JWT 中使用 JTI 声明,但他似乎无法弄清楚如何正确生成它。如果有必要的话,我们在任何地方都找不到关于如何生成和格式化 JTI 的清晰和直截了当的解释。如果有人能为我们解决问题,我们将不胜感激。
更新: 这是使用的代码示例
var randomNumber1 = Math.floor(Math.random() * Math.floor(254));
var randomText = Math.random().toString(36).substr(2, 12);
var randomNumber2 = Math.floor(Math.random() * Math.floor(81458));
var oHeader = alg: 'HS256', cty: 'text/plain';
var oPayload = ;
oPayload.publicKey = "myPublicKey";
oPayload.schema = "mySchema";
oPayload.baseUrl = "www.example.org";
oPayload.exp = (new Date().getTime() / 1000|0) + 5 * 60;
oPayload.iss = "myIssuer";
oPayload.domain = "myDomain";
oPayload.jti = randomNumber1 + "-" + randomText + "-" + (new
Date().getTime() / 1000|0) + 5 * 60;
oPayload.iat = new Date().getTime() / 1000|0;
var hash = CryptoJS.MD5("Message", (new Date().getTime() / 1000|0)
+ 5 * 60);
console.log(hash);
如果需要更多信息,请询问。
提前致谢。
【问题讨论】:
你应该把你写的代码贴出来…… 我目前无权访问代码。我所要求的只是更清楚地解释如何生成和格式化 JTI,因为据我们所知,这在任何地方都没有明确定义。 好的,看看这个答案:***.com/a/29946630/1703744 【参考方案1】:Mark M. 链接的另一个答案包含 JWT 规范的摘录,该规范描述了 jti 声明的要求。基本上,它作为一个标识符工作,因此它在使用的任何范围内都必须是唯一的。这意味着什么取决于应用程序。
此声明难以猜测并不重要,因为每次创建新声明时,您都会辞职并重新生成整个令牌。所以你甚至可以使用一个简单的计数器,只要你能确保同一个计数器不会在不同的令牌上被使用两次,即使是偶然的。
在大多数情况下,一些已经建立的用于生成(半)随机唯一 ID 的解决方案可能是您最好的选择。一些建议:
-
确保您可以使用 UUID。他们有一个受欢迎的npm package。
这个包的实现显然是基于Node原生的
crypto.randomBytes()
,它本身就是一个选项。
如果您使用 Mongo,也许 Mongo 的 ObjectId 可以工作。
也可以像您的同事那样使用 Math.random()
(可能还有日期)。
如前所述,计数器可能在某些情况下起作用。
每一个都提供不同程度的随机性/唯一性,同时在 CPU 上施加不同的负载并产生不同大小/长度的 ID。您是决定哪种解决方案最合适的人。对于我的用例,我将选择randomBytes
,因为我发现它足以满足我的需求:
How random is crypto#randomBytes?
Are the odds of a cryptographically secure random number generator generating the same uuid small enough that you do not need to check for uniqueness?
它在性能方面可能很昂贵,但我不需要太多字节,而且它有一个非阻塞模式,它使用 libuv 的线程池。
【讨论】:
OT,我认为写Math.floor(254)
或1000|0
没有任何意义:]以上是关于在 javascript 中为 JWT 生成 JTI 声明的主要内容,如果未能解决你的问题,请参考以下文章
为在 javascript 中使用 jwt 令牌的方法编写单元测试
如何在 Javascript 中为不和谐机器人制作随机生成器?
在 JavaScript 中为我的牌组生成卡片时出现随机错误
如何在 JavaScript 中为 JSON / XML 数据生成 MLM(多层次营销)树