reactjs 使用useQuery设置Cookie时出现问题

9nvpjoqh  于 2023-03-01  发布在  React
关注(0)|答案(2)|浏览(123)

这是我第一次使用useQuery,我甚至不知道这个问题是否与useQuery有关,但我在为进一步的用户交互设置Cookie时遇到了麻烦。
登录函数在使用useForm()的LoginForm.tsx中启动

const { mutate: login, isLoading } = useLoginMutation();

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<LoginInputType>();

  function onSubmit({ email, password, remember_me }: LoginInputType) {
    login({
      email,
      password,
      remember_me,
    });
    console.log(email, password, remember_me, 'data');
  }

这是use-login.tsx,其中存在useLoginMutation。useLoginMutation运行登录函数。

async function login(input: LoginInputType) {
  return http.post(API_ENDPOINTS.LOGIN, input);
}

export const useLoginMutation = () => {
  const { authorize, closeModal } = useUI();
  return useMutation((input: LoginInputType) => login(input), {
    onSuccess: (data: any) => {
      console.log(data); //undefined
      Cookies.set('auth_token', data.token);
      authorize();
      closeModal();
    },
    onError: (data) => {
      console.log(data, 'login error response');
    },
  });
};

下面是login()使用的http函数

const http = axios.create({
  baseURL: process.env.NEXT_PUBLIC_REST_API_ENDPOINT,
  timeout: 30000,
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
});

// Change request data/error here
http.interceptors.request.use(
  (config) => {
    const token = getToken();
    console.log(token + ' from http.ts');
    config.headers = {
      ...config.headers,
      Authorization: `Bearer ${token ? token : ''}`,
    };
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

 //this is getToken() which I imported
export const getToken = () => {
  if (typeof window === undefined) {
    return null;
  }
  return Cookies.get('auth_token');
};

由于我的前端使用cookie,我也为后端设置了cokies
userController.js

exports.login = asyncHandler(async (req, res, next) => {
  const user = await User.findOne({ email: req.body.email });

  if (!user || !(await bcrypt.compare(req.body.password, user.password))) {
    return next(new ApiError('Incorrect email or password', 401));
  }
  // 3) generate token
  const token = await createToken(user._id);

  // Delete password from response
  delete user._doc.password;

  // 4) set cookie
  res.cookie('auth_token', token, {
    httpOnly: true,
    maxAge: 72 * 60 * 60 * 1000,
  });

  // 5) send response to client side
  res.status(200).json({ data: user, token });
});

当我运行登录从 Postman 我可以看到用户对象和承载令牌,我可以使用其他用户功能,希望autherization。我可以看到他们,当我从前端登录,以及我可以看到SetHeader在响应上的网络选项卡太多,但我的我不能设置cookie的前端。控制台。日志不会记录响应数据和cookie不会被正确设置。我尝试了,但无法作出React,返回的对象在所有。我觉得我错过了一些非常基础和基本的东西,但不能弄清楚。

6jygbczu

6jygbczu1#

那么,改变login()函数就解决了这个问题。

async function login(input: LoginInputType) {
  const { data } = await http.post(API_ENDPOINTS.LOGIN, input);
  return data;
}
kmynzznz

kmynzznz2#

看起来您对设置为httpOnly时cookie的工作方式感到困惑。当您将服务器中的cookie设置为httpOnly时,不需要在客户端手动设置auth_token。实际上,这是不可能的,因为JavaScript的设计无法访问httpOnly cookie。
在客户端,你唯一需要做的就是确保cookie包含在所有未来的请求中,为了使用axios,你需要包含withCredentials: true选项:https://axios-http.com/docs/req_config.
注:当您将cookie设置为httpOnly时,您可能还需要在服务器上添加其他选项,例如secure: truedomain: .example.com

相关问题