【问题标题】:ReactJS: How to implement react-cookie properly in an action?ReactJS:如何在动作中正确实现 react-cookie?
【发布时间】:2018-11-14 13:05:29
【问题描述】:

我读过文章,将令牌保存在localstorage 中对 XSS 攻击很危险。所以我决定将我的令牌存储在 cookie 中。我正在使用react-cookie。我看到了这些例子,我正在尝试这样做,但我的 auth.jsconst 组成,不是一个类,所以我不知道如何使用 withCookies(),这是我的 auth.js 我在哪里要将令牌存储到 cookie:

import {
  LOGIN,
  LOGIN_SUCCESS,
  LOGIN_FAILED,

  GET_USER_DATA,
  GET_USER_DATA_SUCCESS,
  GET_USER_DATA_FAILED,

  LOGOUT,
  LOGOUT_SUCCESS,
  LOGOUT_FAILED,
} from './types'

import axios from 'axios'
var api = require ('./../api.js');


export const login = (email, pass) => {
    return (dispatch) => {
        dispatch({
            type: LOGIN
        })
        var url = api.logInApi
        axios.post(url, {
              email: email,
              password: pass
            })
            .then(res => {
                dispatch({
                    type: LOGIN_SUCCESS,
                    payload: res.data
                })
                localStorage.setItem('token', res.data.token)
                dispatch(getUserData())
            })
            .catch(err => dispatch({
                type: LOGIN_FAILED,
                payload: err
            }))
    }
}



export const getUserData = () => {
    return (dispatch) => {
        dispatch({
            type: GET_USER_DATA
        })
        var url = api.getUserDataApi
        axios.post(url, {}, {headers: {
                "Authorization": `Bearer ${localStorage.getItem("token")}` 
              }})
            .then(res => {
                dispatch({
                    type: GET_USER_DATA_SUCCESS,
                    payload: res.data
                })
            })
            .catch(err => dispatch({
                type: GET_USER_DATA_FAILED,
                payload: err
            }))
    }
}


export const logout = () => {
    return (dispatch) => {
        dispatch({
            type: LOGOUT
        })
        var url = api.logoutApi
        axios.post(url, {}, {headers: {
                "Authorization": `Bearer ${localStorage.getItem("token")}` 
              }})
            .then(res => {
                window.location.replace("")
                dispatch({
                    type: LOGOUT_SUCCESS,
                    payload: res.data
                })
            })
            .catch(err => dispatch({
                type: LOGOUT_FAILED,
                payload: err
            }))
    }
}

现在,我尝试这样做,当然它不起作用:

import {
  LOGIN,
  LOGIN_SUCCESS,
  LOGIN_FAILED,

  GET_USER_DATA,
  GET_USER_DATA_SUCCESS,
  GET_USER_DATA_FAILED,

  LOGOUT,
  LOGOUT_SUCCESS,
  LOGOUT_FAILED,
} from './types'

import axios from 'axios'
import { withCookies, Cookies } from 'react-cookie'; <<added this
var api = require ('./../api.js');

const login  = (email, pass) => {
    return (dispatch) => {
        dispatch({
            type: LOGIN
        })
        const { cookies } = props; <<added this
        var url = api.logInApi
        axios.post(url, {
              email: email,
              password: pass
            })
            .then(res => {
                dispatch({
                    type: LOGIN_SUCCESS,
                    payload: res.data
                })
                cookies.set('token', res.data.token, { path: '/' }); <<added this
                dispatch(getUserData())
            })
            .catch(err => dispatch({
                type: LOGIN_FAILED,
                payload: err
            }))
    }
}
export default withCookies(login) <<added this(wrong)



const getUserData = () => {
    return (dispatch) => {
        dispatch({
            type: GET_USER_DATA
        })
        const { cookies } = props; <<added this
        var token = cookies.get('token'); <<added this
        var url = api.getUserDataApi
        axios.post(url, {}, {headers: {
                "Authorization": `Bearer ${token}` <<added this(this is where I wanna get the cookie)
              }})
            .then(res => {
                dispatch({
                    type: GET_USER_DATA_SUCCESS,
                    payload: res.data
                })
            })
            .catch(err => dispatch({
                type: GET_USER_DATA_FAILED,
                payload: err
            }))
    }
}
export default withCookies(getUserData) <<added this(wrong)


const logout = () => {
    return (dispatch) => {
        dispatch({
            type: LOGOUT
        })
        const { cookies } = props;
        var token = cookies.get('token');
        var url = api.logoutApi
        axios.post(url, {}, {headers: {
            "Authorization": `Bearer ${token}` <<added this
              }})
            .then(res => {
                window.location.replace("")
                dispatch({
                    type: LOGOUT_SUCCESS,
                    payload: res.data
                })
            })
            .catch(err => dispatch({
                type: LOGOUT_FAILED,
                payload: err
            }))
    }
}
export default withCookies(logout) <<added this(wrong)

这是错误的,因为应该只有一个导出默认值。但是我不知道如何将 withCookies 实现为 const,并且示例中还包含这些,我不知道是否需要它们或将它们放在哪里:

  static propTypes = {
    cookies: instanceOf(Cookies).isRequired
  };

  constructor(props) {
    super(props);

    const { cookies } = props;
    this.state = {
      name: cookies.get('name') || 'Ben'
    };
  }

另外,另一个问题是,我可以在项目中的任何位置访问我的 cookie,对吗?就像我的项目如何访问localstorage 一样?

我希望有人可以帮助我,我是这方面的新手。我以前从未使用过cookies,所以感谢您的考虑。

【问题讨论】:

    标签: javascript reactjs cookies


    【解决方案1】:

    我个人更愿意使用js-cookie 来写入/读取cookie。

    它有一个非常基本的 API:

    Cookie.set('cookie_name', 'value') // will set "cookie_name" to "value"
    Cookie.get('cookie_name') // will return "value"
    

    这意味着:

    const login  = (email, pass, cookie) => {
        return (dispatch) => {
            dispatch({
                type: LOGIN
            })
            var url = api.logInApi
            axios.post(url, {
                  email: email,
                  password: pass
                })
                .then(res => {
                    dispatch({
                        type: LOGIN_SUCCESS,
                        payload: res.data
                    })
                    cookies.set('token', res.data.token);
                    dispatch(getUserData())
                })
                .catch(err => dispatch({
                    type: LOGIN_FAILED,
                    payload: err
                }))
        }
    }
    

    在第三个参数中传递给login 函数js-cookie 的Cookie。

    现在,您仍然可以使用相同的 react-cookie 包来读取 cookie 值(我相信不应该有任何冲突)。或者您可以将其替换为js-cookie。但是,为此,您必须将 Cookie 对象传递给 props。如果您使用的是Redux,我可能会使用mapStateToProps 来做到这一点,或者只是通过JSX 传递它

    【讨论】:

    • 我会看看js-cookie。我会在一分钟内回复你:)
    • 我相信是Cookies.getCookies.set
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2021-11-03
    • 1970-01-01
    • 2022-01-22
    • 2019-04-24
    • 2017-04-14
    • 2018-12-07
    • 2012-10-14
    相关资源
    最近更新 更多