Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成JWT表单头和有效负载_Javascript_Node.js_Jwt_Jwt Auth - Fatal编程技术网

Javascript 生成JWT表单头和有效负载

Javascript 生成JWT表单头和有效负载,javascript,node.js,jwt,jwt-auth,Javascript,Node.js,Jwt,Jwt Auth,我正在使用NodeJS在后端服务器中创建jwt。 我正在使用一个库来签署/验证JWT,它工作正常。一旦有一个jwt.io,我就会粘贴我登录时得到的令牌,这样我就可以在有效负载中看到我的数据。 所以问题是,我试图从头文件和我在jwt.io中得到的有效负载生成签名 这是我试图做的,但没有成功,我有点困惑。 用于签名的算法是默认的HS256算法 const crypto = require("crypto"); // encode base64 the header let jsonHeader =

我正在使用NodeJS在后端服务器中创建jwt。 我正在使用一个库来签署/验证JWT,它工作正常。一旦有一个jwt.io,我就会粘贴我登录时得到的令牌,这样我就可以在有效负载中看到我的数据。 所以问题是,我试图从头文件和我在jwt.io中得到的有效负载生成签名 这是我试图做的,但没有成功,我有点困惑。 用于签名的算法是默认的HS256算法

const crypto = require("crypto");

// encode base64 the header
let jsonHeader = JSON.stringify({
  alg: "HS256",
  typ: "JWT",
});
let bs64header = Buffer.from(jsonHeader).toString("base64").split("=")[0];
console.log("bs64header :>>\n ", bs64header); //look the same as the token i got

// encode vase64 the payload
let jsonPayload = JSON.stringify({
  id: "5eb20004ac94962628c68b91",
  iat: 1589125343,
  exp: 1589989343,
  jti: "37743739b1476caa18ca899c7bc934e1aba63ba1",
});
let bs64payload = Buffer.from(jsonPayload).toString("base64").split("=")[0];
console.log("bs64Payload :>> \n", bs64payload); //look the same as the token i got

// TRY to generate the signature from the Base64Header and Base64Payload
// with the secret code that i used to sign the JWT
let secret = "0d528cb666023eee0d44e725fe9dfb751263d2f68f07998ae7388ff43b1b504f";
let signature = bs64header + "." + bs64payload;

let hashed = crypto
  .createHash("sha256", secret)
  .update(signature)
  .digest("hex");

console.log("hashed :>> \n", hashed);

let bs64signature = Buffer.from(hashed).toString("base64").split("=")[0];
console.log("bs64signature>>", bs64signature); //This is where i got stuck.

// let jwt = bs64header + "." + bs64payload + "." + bs64signature;
// console.log("jwt>>", jwt);



我已经对你的代码做了很多修改,以减少重复性和易读性。我不完全确定这是否可行,所以如果有任何错误,请发表评论

我已经在中进行了测试,还检查了输出应该使用什么。输出看起来是一样的,所以我很确定这是可行的

更改

  • 创建了一个base64编码对象和字符串的函数
  • 创建了一个函数,使base64字符串使用URL安全字符集
  • 更改为,以便可以实际使用密钥

为什么要自己生成jwt字符串??我想你需要调查一下这件事。这将大大减少代码和创建令牌所需的所有手动步骤。令牌非常敏感,结构有一个错误,您将无法验证或读取它。我使用jwt.sign()创建令牌,使用jwt.verify()检查令牌是否正确。但当我想为用户创建一个注销根目录时,这两种方法并不安全。因此,我需要在有效负载中创建自己的令牌,并使用一些自定义声明,以便稍后进行验证!您可以在通过JSONWebToken库创建令牌时添加自定义声明。你所说的这些方法不安全到底是什么意思?你可以在你的令牌中提供一个角色范围来检查它是什么类型的用户。事实上,我没有对JWT进行更多的研究并试图理解它,这是我的错。我也同意你的第一句评论,使用npmjs.com/package/jsonwebtoken也会更有用。但在最后,这是一个很好的练习,有助于更好地了解JWT如何工作以及如何自己制作。谢谢!!这项工作也很重要。在检查您的答案之前,我还需要一个解决方案。所以我缺少的是这个-创建了一个函数,使base64字符串使用URL安全字符集。-将crypto.createHash()更改为crypto.createHmac(),以便可以实际使用密钥。
// base64 encode the data
function bs64encode(data) {
  if (typeof data === "object") {
    data = JSON.stringify(data);
  }

  return bs64escape(Buffer.from(data).toString("base64"));
}

// modify the base64 string to be URL safe
function bs64escape(string) {
  return string.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
}



// base64 encode the header
let bs64header = bs64encode({
  alg: "HS256",
  typ: "JWT"
});

console.log("bs64header :>>\n ", bs64header);


// base64 encode the payload
let bs64payload = bs64encode({
  id: "5eb20004ac94962628c68b91",
  iat: 1589125343,
  exp: 1589989343,
  jti: "37743739b1476caa18ca899c7bc934e1aba63ba1"
});

console.log("bs64payload :>> \n", bs64payload);


// generate the signature from the header and payload
let secret = "0d528cb666023eee0d44e725fe9dfb751263d2f68f07998ae7388ff43b1b504f";
let signature = bs64header + "." + bs64payload;

let bs64signature = bs64escape(crypto
  .createHmac("sha256", secret)
  .update(signature)
  .digest("base64"));

console.log("bs64signature>>", bs64signature);


let jwt = bs64header + "." + bs64payload + "." + bs64signature;

console.log("jwt>>", jwt);