托管我的网站时未获取 cookie

问题描述 投票:0回答:1

在托管网站时检索当前用户令牌时出现问题,但在本地主机上工作正常

后端代码(Node.js / Express):

  • indexController.js:
  • 包括处理检索当前用户的“currentUser”和“signin”函数
  • 路由器.js:
  • 定义“/signin”和“/user”的路由。
  • sendtoken.js:
  • 包含负责将令牌发送到客户端的“sendToken”函数。

前端代码(Redux):

用于获取当前用户数据和登录用户的 Redux 操作。

问题:当我尝试在托管网站上登录或检索当前用户的数据时,无法检索

currentuser
功能的令牌。

这是我的indexController.js

exports.currentUser = catchAsyncErrors(async (req, res, next) => {
  const user = await User.findById(req.id).exec()
  res.json({ user })
})

exports.signin = catchAsyncErrors(async (req, res, next) => {
  const user = await User.findOne({ email: req.body.email }).select("+password").exec()
  if (!user)
    return next(new ErrorHandler("User not found with this email address", 404))
  const isPasswordMatched = await user.comparePassword(req.body.password)
  if (!isPasswordMatched)
    return next(new ErrorHandler("Wrong Credentials", 401))
  sendToken(user, 200, res)
})

这是router.js

router.post('/signin', signin)

router.post('/user', isAuthenticated, currentUser)

sendtoken.js

exports.sendToken = (user, statusCode, res) => {
  const token = user.getjwttoken()
  const options = {
    exipres: new Date(
        Date.now() + process.env.COOKIE_EXPIRE * 24 * 60 * 60 * 1000
    ),
    httpOnly: true,
    secure:true
  }
  console.log(token)
  res.status(statusCode).cookie("token", token, options)
    .json({ success: true, id: user._id,token })
}

Redux 代码

export const asyncCurrentUser = (token) => async (dispatch, getState) => {
  try {
    const response = await axios.post("/user");

    if (response && response.data && response.data.user) {
        console.log(response)
        dispatch(saveUser(response.data.user));
    } else {
        console.error('Invalid response format from server:', response.data);
    }

    return response.data;
  } catch (error) {
    console.error('Error fetching current user data:', error.response?.data ||error.message);
    throw error;
  }
};

export const asyncsigninUser = (user) => async (dispatch, getState) => {
  try {
    const response = await axios.post("/signin", user);
    console.log(response.data.token)
    if (response.status == 200) {
      window.localStorage.setItem("token", response.data.token)
      await dispatch(asyncCurrentUser(response.data.token))
    }

    return response.data;
  } catch (error) {
    console.log(error.response.data);
    throw error;
  }
};
reactjs node.js redux cookies jwt
1个回答
0
投票

关于 Redux 这里我认为你应该在使用

{withCredentials: true}
发出请求时使用
axios
将令牌保存在 cookie 中。

所以就你而言

const response = await axios.post("/user",{withCredentials: true});

// ...do that with other requests

此外,我建议您将其设为

GET
请求,而不是
POST
请求。

router.post('/user', isAuthenticated, currentUser)
© www.soinside.com 2019 - 2024. All rights reserved.