У меня есть 2 HTML-файла: один с формой (который принимает пароль), а другой с секретами. Я написал этот js-код, но когда я его запускаю, он отклоняет каждый неправильный пароль, пока я не введу правильный пароль один раз, а затем, когда я вернусь, он также заберет все неправильные пароли.
Где я ошибаюсь?
import express from "express";
import { dirname } from "path";
import { fileURLToPath } from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));
import bodyParser from "body-parser";
const app = express();
var userAuthorised = false;
app.use(bodyParser.urlencoded({extended: true}));
function passCheck(req, res, next) {
if (req.body["password"] === "ILoveProgramming"){
userAuthorised = true;
}
next();
}
app.use(passCheck);
app.get("/", (req, res) => {
res.sendFile(__dirname + "/public/index.html");
});
app.post("/check", (req, res) => {
console.info(req.body);
if (userAuthorised){
res.sendFile(__dirname + "/public/secret.html");
}
else {
res.redirect("/");
}
});
app.listen(3000, () => {
console.info("Server Running on port 3000");
});
Кажется, сейчас самое время начать изучать существующие функции аутентификации, а не создавать свои собственные.
Вам следует найти лучший способ обработки авторизации. Проверьте jwt
Когда вы запускаете сервер, вы инициализируете
var userAuthorised = false;
Однажды он настроен на
userAuthorised = true;
ей никогда не присваивается значение false
, потому что это глобальная переменная, и инициализация происходит только один раз в начале.
Состояние
if (userAuthorised){
всегда будет истинным после первого правильного входа в систему.
Решение состоит в том, чтобы не использовать для этого глобальную переменную. Распространенным шаблоном в Express является сохранение в запросе дополнительных значений, например.
req.userAuthorised = true;
и проверьте их с помощью
if (req.userAuthorised){
Потому что
userAuthorised
— глобальная переменная. Это не относится к запросу, оно применимо к каждому запросу от каждого клиента.