Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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 通过express处理jwt令牌返回错误“;const token=req.cookies.auth;[0]^[0][0]引用错误:未定义请求";_Javascript_Node.js_Express_Jwt - Fatal编程技术网

Javascript 通过express处理jwt令牌返回错误“;const token=req.cookies.auth;[0]^[0][0]引用错误:未定义请求";

Javascript 通过express处理jwt令牌返回错误“;const token=req.cookies.auth;[0]^[0][0]引用错误:未定义请求";,javascript,node.js,express,jwt,Javascript,Node.js,Express,Jwt,我正在尝试完成jwt登录我正在尝试在登录中创建jwt令牌。然后我正在尝试在我的用户问题路由中使用它 我使用的是react前端 这样做正确吗 我目前收到一个错误 const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req is not defined 下面是my routes登录代码,它在my sql server返回电子邮件和密码的值存在时分配令牌。用户问题尝试使用此jwt。我还介绍了如何在函

我正在尝试完成jwt登录我正在尝试在登录中创建jwt令牌。然后我正在尝试在我的用户问题路由中使用它

我使用的是react前端

这样做正确吗

我目前收到一个错误

const token = req.cookies.auth;
[0]               ^
[0]
[0] ReferenceError: req is not defined

下面是my routes登录代码,它在my sql server返回电子邮件和密码的值存在时分配令牌。用户问题尝试使用此jwt。我还介绍了如何在函数中验证令牌

Verfiy用户

app.get("/user-questions", verifyToken, function(req, res) {
  app.use(function(req, res, next) {
    // decode token
    if (token) {
      jwt.verify(token, "secret", function(err, token_data) {
        if (err) {
          console.info("token did not work");
          return res.status(403).send("Error");
        } else {
          req.user_data = token_data;
          sql.connect(config, function(err) {
            if (err) console.log(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.execute("dbo.ViewQuestions", function(err, recordset) {
              if (err) console.log(err);

              // send records as a response

              res.json(recordset);
              next();
            });
          });
        }
      });
    } else {
      console.info("no token");
      console.log("no token");
      return res.status(403).send("No token");
    }
  });
});

登录路径

app.post("/login", async (req, response) => {
  try {
    await sql.connect(config);

    var request = new sql.Request();
    var Email = req.body.email;
    var Password = req.body.password;

    console.log({ Email, Password });

    request.input("Email", sql.VarChar, Email);
    request.input("Password", sql.VarChar, Password);

    var queryString =
      "SELECT * FROM TestLogin WHERE email = @Email AND password = @Password";

    //"SELECT * FROM RegisteredUsers WHERE email = @Email AND Password = HASHBYTES('SHA2_512', @Password + 'skrrt')";

    const result = await request.query(queryString);

    if (result.recordsets[0].length > 0) {
      console.info("/login: login successful..");
      console.log(req.body);

      token = jwt.sign(
        { Email },
        "secretkey",
        { expiresIn: "30s" },
        (err, token) => {
          res.json({
            token
          });
          res.cookie("auth", token);
          res.send("ok");
        }
      );
    } else {
      console.info("/login: bad creds");
      response.status(400).send("Incorrect email and/or Password!");
    }
  } catch (err) {
    console.log("Err: ", err);
    response.status(500).send("Check api console.log for the error");
  }
});

验证用户


// Verify Token
function verifyToken(req, res, next) {
  // Get auth header value
  const bearerHeader = req.headers["authorization"];
  // Check if bearer is undefined
  if (typeof bearerHeader !== "undefined") {
    // Split at the space
    const bearer = bearerHeader.split(" ");
    // Get token from array
    const bearerToken = bearer[1];
    // Set the token
    req.token = bearerToken;
    // Next middleware
    next();
  } else {
    // Forbidden
    res.sendStatus(403);
  }
}
请告知这在理论上是否可行。如果没有,请告知如何解决

编辑:

这个错误已经解决了,但是现在我的jwt令牌不起作用了。当我登录并手动路由到用户问题时,它不会加载组件,并且在控制台中显示403不可用(当jwt令牌不工作时,这在代码中设置)

更新:

我该如何包括

 ['authorization'] = 'Bearer ' + token;
进入


handleSubmit(e){
e、 预防默认值();
if(this.state.email.length<8 | | this.state.password.length<8){
警告(`请正确输入表格');
}否则{
const data={email:this.state.email,密码:this.state.password};
获取(“/login”{
方法:“POST”、//或“PUT”
标题:{
接受:“application/json,text/plain,*/*”,
“内容类型”:“应用程序/json”,
},
正文:JSON.stringify(数据)
})
//.then(response=>response.json())
。然后(数据=>{
console.log(“成功:”,数据);
})
.catch(错误=>{
控制台错误(“错误:”,错误);
});
}
}

您的代码有几个错误:

  • 在您的
    /login
    路线中:
    • 您正在尝试在发送响应后设置“auth”cookie
    • 您尝试发送两次响应,一次通过
      res.json
      发送,一次通过
      res.send
    • 您正在分配给一个不再存在的
      token
      变量(
      token=jwt.sign(…)
  • 在您的
    verifyToken
    方法中:
    • 此方法只是验证请求是否具有令牌集,而不是验证或解码它。我将考虑将您的<代码> jWt.Valuffe()/Cux>调用这个方法。
  • 在您的
    /用户问题
    路线中:
    • 您正在调用
      app。在
      app.get
      的内部使用
      ,当这两个函数都要在根级别调用时。删除你的
      应用程序。使用
      呼叫
    • 您需要从请求中获取
      token
      ,例如
      const{token}=req
    • 您正在通过
      res.json()
      发送响应,但之后仍在调用
      next()
      。从: 如果当前中间件函数没有结束请求-响应周期,它必须调用next()将控制权传递给下一个中间件函数


以下是我将如何进行这些更改:

  • /login
    路线:
app.post(“/login”),异步(请求,响应)=>{
试一试{
等待sql.connect(配置);
var request=new sql.request();
var Email=req.body.Email;
var Password=req.body.Password;
log({Email,Password});
请求输入(“电子邮件”,sql.VarChar,电子邮件);
请求.输入(“密码”,sql.VarChar,密码);
变量查询字符串=
“从TestLogin中选择*,其中email=@email和password=@password”;
//“从RegisteredUsers中选择*,其中email=@email和Password=HASHBYTES('SHA2_512',@Password+'skrrt')”;
const result=wait request.query(queryString);
if(result.recordsets[0]。长度>0){
console.info(“/login:login successful..”;
控制台日志(请求主体);
jwt符号(
{Email},
“秘密密钥”,
{expiresIn:“30s”},
(err,token)=>res.cookie('auth',token).json({token})
);
}否则{
console.info(“/login:bad creds”);
回复。状态(400)。发送(“错误的电子邮件和/或密码!”);
}
}捕捉(错误){
日志(“Err:,Err”);
response.status(500.send)(“检查api console.log以了解错误”);
}
});
  • verifyToken
    方法:
//验证令牌
功能验证令牌(req、res、next){
//获取身份验证标头值
const bearerHeader=请求头[“授权”];
//检查持票人是否未定义
if(承载器类型!=“未定义”){
//在空间上分裂
const bearer=bearerHeader.split(“”);
//从数组中获取令牌
const bearerToken=bearer[1];
//验证令牌并将其存储
jwt.verify(bearerToken,“secret”,函数(err,decodedToken){
如果(错误){
console.info(“令牌不起作用”);
返回res.status(403).send(“错误”);
}
//设置令牌
req.token=bearerToken;
req.decodedToken=decodedToken;
next();
});
}否则{
//禁止的
res.sendStatus(403);
}
}
  • /用户问题
    路线:
app.get(“/user questions”),验证令牌,函数(req,res){
//如果一个请求已经到达这一点,那么我们知道他们有一个有效的令牌
//并且该令牌可通过req.token(编码)或
//或req.decodedToken
sql.connect(配置,函数(错误){
if(err)console.log(err);
//创建请求对象
var request=new sql.request();
//查询数据库并获取记录
request.execute(“dbo.ViewQuestions”),函数(err,recordset){
if(err)console.log(err);
//将记录作为响应发送
res.json(记录集);
});
});
});

您的代码有几个错误:

    handleSubmit(e) { e.preventDefault(); if (this.state.email.length < 8 || this.state.password.length < 8) { alert(`please enter the form correctly `); } else { const data = { email: this.state.email, password: this.state.password }; fetch("/login", { method: "POST", // or 'PUT' headers: { Accept: "application/json, text/plain, */*", "Content-Type": "application/json", }, body: JSON.stringify(data) }) // .then(response => response.json()) .then(data => { console.log("Success:", data); }) .catch(error => { console.error("Error:", error); }); } }