我问这是因为一个同事已经被困了几天了。问题是,他试图在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);
如果需要更多信息,请询问。
谢谢。
答案 0 :(得分:0)
由Mark M.链接的另一个答案包含JWT规范的摘录,该摘录描述了 jti 声明的要求。基本上,它用作标识符,因此无论使用什么范围,它都必须是唯一的。这意味着什么取决于应用程序。
这个说法很难被猜到是不重要的,因为每次创建一个新的令牌时,您都将辞职并重新生成整个令牌。因此,您可以使用一个简单的计数器,前提是可以确保即使在偶然的情况下,同一计数器也永远不会在不同的令牌上使用两次。
在大多数情况下,某些已经确定的用于生成(半)随机唯一ID的解决方案可能是您最好的选择。一些建议:
crypto.randomBytes()
,它本身是一个选择。Math.random()
(可能还有日期)作为您的同事。其中的每一个都提供了不同程度的随机性/唯一性,同时给CPU施加了不同的负载并产生了不同大小/长度的ID。您是决定哪种解决方案最合适的人。对于我的用例,我会选择randomBytes
,因为我发现它足以满足我的需求:
How random is crypto#randomBytes?
从性能上讲可能是昂贵的,但是我不需要太多字节,并且它具有非阻塞模式,该模式使用libuv的线程池。