Файлы cookie, предотвращающие выход из системы в Chrome (PassportJS & Express) - PullRequest
0 голосов
/ 06 января 2019

Я только что настроил пользовательскую функциональность на своем сайте сегодня, но, похоже, в Chrome есть проблема с cookie, из-за которой я не могу выйти из системы при входе в систему как пользователь.

Когда я нажимаю кнопку выхода из системы, меня возвращают на домашнюю страницу, но я все еще вошел в систему. Я поместил некоторые console.logs в маршрут / logout, и кажется, что они не запускаются, когда я получить доступ к маршруту.

Если я обновлю файлы cookie моего браузера, я смогу выйти из системы один раз. Если я снова войду в систему, я больше не смогу выйти. Очень странно. Если я захожу в любой другой браузер (или на свой телефон), я могу постоянно выходить из системы без проблем. Это также работает, если я нахожусь на вкладке инкогнито в Chrome.

Я пробовал все, что угодно, с точки зрения кода, который может удалить куки (req.session.destroy () и т. Д.) Безрезультатно.

Вот мой код:

// Настройка

app.use(require("express-session")({
    secret: "Something",
    resave: false,
    saveUninitialized: false
}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use(function(req, res, next) {
    res.locals.currentUser = req.user;
    res.locals.error = req.flash("error");
    res.locals.success = req.flash("success");
    next();
});

// Все маршруты

app.get("/signup", function(req, res) {
    res.render("signup.ejs");
});

app.post("/signup", function(req, res) {
    User.register(new User({username: req.body.username}), req.body.password, function(err, newUser) {
        if (err) {
            console.log(err);
        } else {
            passport.authenticate("local")(req, res, function() {
                req.flash("success", "You're now registered in as " + newUser.username + "!");
                res.redirect(301, "/");  
            });
        }
    })
});

app.get("/login", function(req, res) {
    res.render("login.ejs");
});

app.post("/login", passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/login"
}), function(req, res) {
});

app.get("/logout", function(req, res) {
    req.logout();
    req.flash("success", "You have logged out!");
    res.redirect(301, "/");
});

// HTML (с использованием EJS)

<div class="nav__user">
                    <% if (!currentUser) { %>

                        <a href="/login" class="loginButton">Login</a>
                        <a href="/signup" class="signupButton">Sign Up</a>

                    <% } else { %>

                        <p><%= currentUser.username %></p>
                        <a href="/logout">Log Out</a>

                    <% } %>
</div>

И, если это поможет, вот что я вижу на вкладке сети Chrome:

Response Headers:

HTTP/1.1 301 Moved Permanently

x-powered-by: Express

location: /

vary: Accept

content-type: text/html; charset=utf-8

content-length: 58

date: Sat, 05 Jan 2019 22:27:19 GMT

X-BACKEND: apps-proxy

Request Headers:

Provisional headers are shown

Referer: https://webdevbootcamp-osaisus.c9users.io/

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/71.0.3578.98 Safari/537.36

Любая помощь очень ценится. Не знаю, что может быть причиной этого.

1 Ответ

0 голосов
/ 06 января 2019

На самом деле ваша проблема не имеет ничего общего с файлами cookie.

Chrome будет кэшировать HTTP 301 коды ответов, полученные для запросов HTTP GET (что имеет смысл, поскольку 301 определен как «Перемещено постоянно»). Эти данные перенаправления хранятся в другом месте, чем кеш, в котором хранятся ресурсы, такие как изображения или сценарии, и не будут сбрасываться командами, такими как «пустой кэш и полная перезагрузка», которые применяются только к этим активам.

Есть несколько способов очистить эти данные, если Chrome перейдет в это состояние. См. этот вопрос для суперпользователя для получения подробной информации, в частности ответов, в которых упоминается chrome://net-internals или консоль разработчика Chrome.

Есть также несколько способов избежать такого поведения. Одним из них является добавление заголовка Cache-Control к вашему ответу на /logout, как описано здесь :

Вы можете добавить заголовки управления кэшем к 301, и мы будем следовать им (срок действия и т. Д.)

Правильнее всего сделать перенаправление, используя код ответа, отличный от HTTP 301, что означает «вы просили что-то, что ушло навсегда и вместо этого живет здесь и сейчас». Мнения здесь кажутся разными, но 302 или, может быть, 307 могут быть правильным выбором.

Другой вариант - изменить ваш экспресс-маршрут на .post с текущего .get и написать Javascript, чтобы ваш браузер POST стал /logout при нажатии кнопки. Это не требует установки дополнительных заголовков ответа HTTP на сервере, но требует немного больше кода внутри клиента.

...