обработка токена jwt через express возвращает ошибку "const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req не определен" - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь завершить вход в систему jwt. Я пытаюсь создать токен jwt в логине. Затем я пытаюсь использовать его в своем маршруте вопросов к пользователю.

Я использую интерфейсную часть реагирования.

Это правильный способ сделать это?

В настоящее время я получаю сообщение об ошибке

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

Ниже приведен код входа в мои маршруты, который назначает токен, как только сервер my sql возвращает значения электронной почты и пароля. Пользователь-вопросы пытается использовать этот 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.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);
        });
    }
  }

1 Ответ

2 голосов
/ 15 января 2020

В вашем коде есть несколько ошибок:

  • В вашем /login маршруте:
    • Вы пытаетесь установить "auth" cook ie после ответ отправляется
    • Вы пытаетесь отправить ответ дважды, один раз через res.json и один раз через res.send
    • Вы назначаете переменную token, которая больше не существует ( token = jwt.sign(...))
  • В вашем методе verifyToken:
    • Этот метод только проверяет, что в запросе установлен токен, он не проверяет и не декодирует его. Я бы посоветовал перенести ваш jwt.verify() вызов на этот метод.
  • На вашем /user-questions маршруте:
    • Вы звоните app.use внутри app.get когда оба они предназначены для вызова на уровне root. Удалите ваш app.use звонок.
    • Вам нужно получить token из запроса, напр. const { token } = req;
    • Вы отправляете ответ через res.json(), но после этого продолжаете звонить next(). Из Express документов :

      Если текущая функция промежуточного программного обеспечения не завершает цикл запрос-ответ , она должна вызвать next (), чтобы передать управление Следующая функция промежуточного программного обеспечения.


Вот как я бы внес эти изменения:

  • /login route :
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);

      jwt.sign(
        { Email },
        "secretkey",
        { expiresIn: "30s" },
        (err, token) => res.cookie('auth', token).json({ token })
      );
    } 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");
  }
});
  • verifyToken метод:
// 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];

    // verify the token and store it
    jwt.verify(bearerToken, "secret", function(err, decodedToken) {
      if (err) {
        console.info("token did not work");
        return res.status(403).send("Error");
      }

      // Set the token
      req.token = bearerToken;
      req.decodedToken = decodedToken;

      next();
    });
  } else {
    // Forbidden
    res.sendStatus(403);
  }
}
  • /user-questions маршрут:
app.get("/user-questions", verifyToken, function(req, res) {
  // if a request has made it to this point, then we know they have a valid token
  // and that token is available through either req.token (encoded)
  // or req.decodedToken

  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);
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...