ものすごく単純。 _/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の値は変更されていません。
長い間迷惑な時間を過ごした後、フロントエンドが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が送信されていない場合、クリアするものは何もありません。
これがお役に立てば幸いです。これをもっと早く見つけていたらよかったのに...
この質問の作者には役立たないでしょうが、これが誰かに役立つことを願っています。 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')
}
(広範囲にわたる)検索と私の頭に浮かんだランダムな考えから判断すると、答えは使用することです
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:も指定する必要があります。
ただの/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');
});