токены jwt не работают правильно после входа в систему (требуется лог c кода) - PullRequest
0 голосов
/ 15 января 2020

Привет. Я много боролся со входом в систему, используя ответный интерфейс, npm express, npm ms sql и npm jsonwebtokens.

Я понимаю логику c, стоящую за этим, но не могу правильно внедрить в мое приложение. Я включил код, в котором я застреваю и который вызывает проблемы.

Это мой маршрут входа в систему на моем сервере. js (используются основные пакеты npm ms sql, express, jsonwebtokens, bodyparser)

Этот маршрут используется при отправке формы регистрации (внешний интерфейс не важен в этом вопросе). Затем он проверяет, содержит ли база данных этот адрес электронной почты и пароль. Если это так, он запрашивает у пользователя «вход в систему успешен», если нет, он запрашивает у пользователя «плохие кредиты». Если вход успешен, он назначает ему токен jwt.


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: "30m" }, (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");
  }
});
// 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);
  }
}


У меня есть метод проверки токена. Предполагается, что он проверяет токен, а затем, если это le git, сохранит его. Однако при использовании маршрута пользовательские вопросы (будут отображаться в следующем блоке кода) всегда выдает ошибку 403.

// 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);
  }
}

Это маршрут с пользовательским вопросом, по которому в первой строке я пытаюсь вызвать проверяйте метод Token при вызове этой выборки, однако он всегда выдает ошибку 403.


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