在JavaScript中为JWT生成JTI声明

时间:2018-10-24 14:41:29

标签: javascript jwt

我问这是因为一个同事已经被困了几天了。问题是,他试图在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);

如果需要更多信息,请询问。

谢谢。

1 个答案:

答案 0 :(得分:0)

Mark M.链接的另一个答案包含JWT规范的摘录,该摘录描述了 jti 声明的要求。基本上,它用作标识符,因此无论使用什么范围,它都必须是唯一的。这意味着什么取决于应用程序。

这个说法很难被猜到是不重要的,因为每次创建一个新的令牌时,您都将辞职并重新生成整个令牌。因此,您可以使用一个简单的计数器,前提是可以确保即使在偶然的情况下,同一计数器也永远不会在不同的令牌上使用两次。

在大多数情况下,某些已经确定的用于生成(半)随机唯一ID的解决方案可能是您最好的选择。一些建议:

  1. 确保可以使用UUID。有一种流行的npm package
  2. 该软件包的实现显然基于Node的本机crypto.randomBytes(),它本身是一个选择。
  3. 如果您使用Mongo,也许Mongo的ObjectId可以工作。
  4. 也可以选择使用Math.random()(可能还有日期)作为您的同事。
  5. 如前所述,计数器在某些情况下可能会起作用。

其中的每一个都提供了不同程度的随机性/唯一性,同时给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的线程池。