web-dev-qa-db-ja.com

ExpressでCookieを削除できません

ものすごく単純。 _/user/login_ルートにそのようなCookieを設定しました。

_if (rememberMe) {
    console.log('Login will remembered.');
    res.cookie('user', userObj, { signed: true, httpOnly: true, path: '/' });
}
else {
    console.log('Login will NOT be remembered.');
}
_

私はすでにcookie-parserの秘密を設定しました:

_app.use(cookieParser('shhh!'));
_

かなり基本的なもの。 Cookieに保存したものをすべて取得できる限り、すべてが正常に機能しています。

_app.use(function (req, res, next) {
    if (req.signedCookies.user) {
        console.log('Cookie exists!');
        req.session.user = req.signedCookies.user;
    }
    else {
        console.log('No cookie found.');
    }

    next();
});
_

このミドルウェアは何よりも先に呼び出されるので、議論のために「Cookieが存在します!」 Cookieが有効な場合は、常にコンソールにログインします。

問題は、Cookieを削除しようとしたときです。 res.clearCookie('user')res.cookie('user', '', { expires: new Date() })を試し、同じフラグ(_/user/login_のres.cookie()に渡す)を渡してみました。これらの方法を組み合わせて使用​​しようとしましたが、何も機能しませんでした。

現在、Cookieをクリアできる(そして「Cookieexists!」ログメッセージを受信しない)唯一の方法は、ブラウザの履歴をクリアすることです。ログアウトルートは次のようになります。

_route.get('/user/logout', function (req, res, next) {
    res.clearCookie('user');
    req.session.destroy();
    util.response.ok(res, 'Successfully logged out.');
});
_

Cookieの値を変更することすらできないようです。置いた

res.cookie('user', {}, { signed: true, httpOnly: true, path: '/' })

ログアウトルートにありますが、Cookieの値は変更されていません。

9
Kenny Worden

長い間迷惑な時間を過ごした後、フロントエンドがCookieをエンドポイントに送信していないことに気付きました。Cookieをクリアしようとしていたのです...

サーバー上:

function logout(req, res) {
  res.clearCookie('mlcl');
  return res.sendStatus(200);
}

そしてフロントエンドでは、

fetch('/logout', { method: 'POST', credentials: 'same-Origin' })

「credentials: 'same-Origin'」を追加することで、clearCookieが機能しました。 Cookieが送信されていない場合、クリアするものは何もありません。

これがお役に立てば幸いです。これをもっと早く見つけていたらよかったのに...

5
Kevin

この質問の作者には役立たないでしょうが、これが誰かに役立つことを願っています。 ExpressAPIを使用していたReactアプリでCookieを削除できないという同じ問題が発生しました。axiosを使用しましたが、数時間後にようやく修正できました。

await axios.post('http://localhost:4000/api/logout', { } , { withCredentials: true })

{ withCredentials: true }はそれが私のために働いた理由です。

これは私のExpressコードです:

 const logOutUser = (req, res) => {
  res.clearCookie('username')
  res.clearCookie('logedIn')
  res.status(200).json('User Logged out')
}
4
Noob

(広範囲にわたる)検索と私の頭に浮かんだランダムな考えから判断すると、答えは使用することです

res.clearCookie('<token_name>',{path:'/',domain:'<your domain name which is set in the cookie>'});

つまり.

    res.clearCookie('_random_cookie_name',{path:'/',domain:'.awesomedomain.co'}); 

サブドメインに使用するため、Cookieで指定されているに注意してください(ドットのないサブドメインにも使用できますが、ドットを使用する方が安全です)。

TLDR; domain:も指定する必要があります。

2
Milan Velebit

クリアする資格情報を送信していることを確認してください

ただの/logoutエンドポイント、資格情報を送信する必要があります。

// FRONT END
let logOut = () => {

  fetch('logout', {
    method: 'get',
    credentials: 'include', // <--- YOU NEED THIS LINE
    redirect: "follow"
  }).then(res => {
    console.log(res);
  }).catch(err => {
    console.log(err);
  });

}


// BACK END
app.get('/logout', (req, res) => {
  res.clearCookie('token');
  return res.status(200).redirect('/login');
});
2
joshuakcockrell