NodeJS Passport.js logout session destroy适用于POSTMAN,但不适用于React应用,如何解决这个问题

nc1teljy  于 2023-03-22  发布在  Node.js
关注(0)|答案(1)|浏览(93)

我有一个Express后端,并试图设置Passport身份验证。登录过程工作正常,会话令牌存储为cookie。注销时,clearCookies不会破坏浏览器中的cookie。然而,当我通过Postman拨打电话时,该过程工作正常。
我已经在后端的axios配置中设置了{ withCredentials: true },在CORS设置中设置了{ credentials: true },还在clearCookies选项中设置了路径。

// BACKEND LOGOUT
exports._logout = (req, res) => {
  req.session.destroy(err => {
    if (err) res.status(422).send(err);
    req.logout();
    res.clearCookie("connect.sid", {domain: 'localhost', path: 
'/'}).status(200).send('Logged out!.')
  });
};

// FRONTEND LOGOUT (REACT/REDUX)
export function logOut() {
return {
    type: 'LOG_OUT',
    payload: new Promise((resolve, reject) => {
        axios
            .post(process.env.ACCOUNT_HOST + `/logout`, {withCredentials: true})
            .then(response => {
                console.log(response);
                resolve(response.data);
            })
            .catch(error => {
                notification.error({
                    message: 'Log In Error',
                    description: error.message,
                    duration: null
                });
                reject(error);
            });
    })
};
}

当我用Postman调用端点时,它会清除cookie,isAuth函数返回预期的值。你知道为什么它没有清除浏览器中的cookie吗?谢谢。

rqenqsqc

rqenqsqc1#

axios在post请求中接受的第二个参数是请求的主体,而不是选项,因此当前您发送{ withCredentials:true }作为body,而不是cookie。所以passport没有cookie,不能销毁会话。这应该可以工作:

axios.post(process.env.ACCOUNT_HOST + `/logout`, {}, {withCredentials: true})

相关问题