【发布时间】:2021-07-29 14:14:57
【问题描述】:
谁能为我提供一个生成 jwt 令牌的示例,该令牌具有三个标头(alg、kid、typ),其格式如下:
{
"alg": "RS256",
"kid": "vpaas-magic-cookie-1fc542a3e4414a44b2611668195e2bfe/4f4910",
"typ": "JWT"
}
在https://developer.8x8.com/jaas/docs/api-keys-jwt下。
Jwt 令牌在几个小时的时间限制内过期,因此我正在尝试找到一种方法在我的代码本身中生成令牌。
最后,我的 javascript 看起来像这样,我在选项列表中添加 jwt 令牌以进行身份验证。
var options = {
roomName: "vpaas-magic-cookie-secretKey/Room123",
jwt: 'JWTTOKEN',
,
根据我在https://jwt.io/ 下阅读的内容,我需要来自解码细节的编码密钥。根据生成令牌,我认为它使用 HS256 算法。在 javascript 中执行此操作的步骤是什么?
编辑:在用户回答后,我对他的代码进行了一些更改,目前正在生成一半的 JWT 令牌。我正在使用服务器上已经生成的令牌检查它 - Jaas.8x8
<script>
const HMACSHA256 = (stringToSign, secret) => "not_implemented"
// The header typically consists of two parts:
// the type of the token, which is JWT, and the signing algorithm being used,
// such as HMAC SHA256 or RSA.
const header = {
"kid": "vpaas-magic-cookie-07fabede3674457a84c95fsecretcode/myroom001",
"alg": "RS256",
"typ": "JWT"
}
const encodedHeaders = btoa(JSON.stringify(header))
// create the signature part you have to take the encoded header,
// the encoded payload, a secret, the algorithm specified in the header,
// and sign that.
const signature = HMACSHA256(`${encodedHeaders}`, "mysecret")
console.log(`${encodedHeaders}.${signature}`)
</script>
从代码生成的令牌是
eyJraWQiOiJ2cGFhcy1tYWdpYy1jb29raWUtMDdmYWJlZGUzNjc0NDU3YTg0Yzk1ZmE4MGIxNGY1ZDcvVGVzdFJhdW0wMDEiLCJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.not_implemented
而网上已经生成的token是:
eyJraWQiOiJ2cGFhcy1tYWdpYy1jb29raWUtMDdmYWJlZGUzNjc0NDU3YTg0Yzk1ZmE4MGIxNGY1ZDcvMTg1ZDY2LVNBTVBMRV9BUFAiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJqaXRzaSIsImV4cCI6MTYyMDM4ODU3NiwibmJmIjoxNjIwMzgxMzcxLCJpc3MiOiJjaGF0Iiwicm9vbSI6IioiLCJzdWIiOiJ2cGFhcy1tYWdpYy1jb29raWUtMDdmYWJlZGUzNjc0NDU3YTg0Yzk1ZmE4MGIxNGY1ZDciLCJjb250ZXh0Ijp7ImZlYXR1cmVzIjp7ImxpdmVzdHJlYW1pbmciOmZhbHNlLCJvdXRib3VuZC1jYWxsIjpmYWxzZSwidHJhbnNjcmlwdGlvbiI6ZmFsc2UsInJlY29yZGluZyI6ZmFsc2V9LCJ1c2VyIjp7Im1vZGVyYXRvciI6dHJ1ZSwibmFtZSI6IlRlc3QgVXNlciIsImlkIjoiYXV0aDB8NjA5M2EyYzM3Zjc3MGEwMDcxMGE5YzY5IiwiYXZhdGFyIjoiIiwiZW1haWwiOiJ0ZXN0LnVzZXJAY29tcGFueS5jb20ifX19.aNqg_VLXyafH8Se5rThe6TLz0F2AEnJSmuoZBQ4fXEm1PMx4SBRpelJsrmL76D_jKS5NT-GkuPDVcDgLv6nx9G4ywjws1AH4Lkt0FcJ3eH2OjbFI2WxPzJF_tDJbtPme5LJmGZwEa509v2QD0r-kr31M7FZ83S-kz3O1xKc33FnMJwNlqvgCSN2S0QwF6R5J01zDk41gCk0wGr3DXAmlz0FtCU0qJ5nN9iMUpr5QUY1D-hRApWMhoLPmxkuqnQKLjGwgxU8lh33wq_Laqu7qV57lYrI27er_c42YePwuitWEAAshQU4Ylf2v8sVRv06kQdFPVvICVdsTTI-DLbc3aQ
所以基本上前几个字符串是正确的,但其余的没有生成。我认为这与我的秘密有关?这究竟是什么?
【问题讨论】:
-
"Jwt 令牌在几个小时的时间限制内过期,所以我正在尝试找到一种方法在我的代码中生成令牌。"如果你只需要一个更长寿的令牌,你可以考虑调整令牌的过期时间,而不是在这里重新发明轮子。
-
@HenryEcker 感谢您的回复。我想这样做,但我获取 JWT 令牌的 api-keys 的最大限制只有 2 小时。
-
你是想用普通的 javascript 来做,还是想要一个令牌?
-
@TheFool 我正在尝试用普通的 js 来做,我在 javascript 中遇到了 base64 标头。也许这就是做到这一点的关键?
-
您在问题开头发布的标头来自使用非对称算法签名的令牌。要创建此类令牌,您需要有权访问授权服务器的私有证书,该证书用于签署令牌。您尝试做的事情似乎不正确 - 您不能在代码中发布令牌并期望它们像某些不同的授权服务器发布的令牌一样工作。除非您拥有服务器的私钥,否则您只能模仿这种行为。
标签: javascript jwt jitsi jitsi-meet