【问题标题】:cookies.remove('abc') not working in reactJscookies.remove('abc') 在 reactJs 中不起作用
【发布时间】:2019-07-18 14:12:04
【问题描述】:
import Cookies from 'universal-cookie';

const cookies = new Cookies();
cookies.remove('abc');

console.log(cookies.getAll());

它仍在打印我的abc cookie。

【问题讨论】:

    标签: reactjs cookies browser


    【解决方案1】:

    如果您在 JWT 快速后端的登录路由/控制器的响应中设置 cookie 并使用“httpOnly”选项,则即使使用第三方,您也无法从客户端/react 访问令牌像“universal-cookie”或“document.cookie”这样的库。

    您需要清除后端响应中的 cookie,例如当用户在注销控制器中注销时,如下所述。

    前端:

    // React redux logout action
    export const logout = () => async (dispatch) => {
        try {
            await axios.get('/api/auth/logout')
            localStorage.removeItem('userInfo')
            dispatch({ type: type.USER_LOGOUT })
        } catch (error) {
            console.log(error)
        }
    }
    

    后端:

    const User = require('../../models/userModel')
    const generateToken = require('../../utils/generateToken')
    
    // @desc    Auth user & get token
    // @route   POST /api/auth/login
    // @access  Public
    const login = async (req, res) => {
        const { email, password } = req.body
        try {
            const user = await User.findOne({ email })
            if (user && (await user.verifyPassword(password))) {
                let token = generateToken(user._id)
                res.cookie('token', token, {
                    maxAge: 7200000, // 2 hours
                    secure: false, // set to true if your using https
                    httpOnly: true,
                })
                res.json({
                    _id: user._id,
                    name: user.name,
                    email: user.email,
                    isAdmin: user.isAdmin,
                    token: token,
                })
            } else {
                res
                    .status(401)
                    .json({ success: false, message: 'Invalid email or password' })
            }
        } catch (error) {
            res.status(500).json({ success: false, message: error.toString() })
        }
    }
    
    // @desc    Logout controller to clear cookie and token
    // @route   GET /api/auth/login
    // @access  Private
    const logout = async (req, res) => {
        // Set token to none and expire after 1 seconds
        res.cookie('token', 'none', {
            expires: new Date(Date.now() + 1 * 1000),
            httpOnly: true,
        })
        res
            .status(200)
            .json({ success: true, message: 'User logged out successfully' })
    }
    
    module.exports = {
        login,
        logout,
    }
    

    【讨论】:

      【解决方案2】:

      我只是为将来可能遇到类似问题的人添加这个,就像我今天一样。这可能是异步操作的问题。设置、删除 cookie 是异步的。

      【讨论】:

        【解决方案3】:

        Cookie 需要附加路径和域才能被删除。试试这个:

        cookies.remove("abc", {path: "/", domain: ".example.com"})  
        

        【讨论】:

          【解决方案4】:

          可能你需要做一些类似的事情

          cookies.remove('abc', { path: '/' });
          

          更多信息here

          【讨论】:

            猜你喜欢
            • 2015-11-05
            • 2021-11-08
            • 2021-08-18
            • 2021-09-14
            • 1970-01-01
            • 1970-01-01
            • 2023-02-03
            • 1970-01-01
            • 2017-06-03
            相关资源
            最近更新 更多