这是我第一次使用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,返回的对象在所有。我觉得我错过了一些非常基础和基本的东西,但不能弄清楚。
2条答案
按热度按时间6jygbczu1#
那么,改变login()函数就解决了这个问题。
kmynzznz2#
看起来您对设置为
httpOnly
时cookie的工作方式感到困惑。当您将服务器中的cookie设置为httpOnly
时,不需要在客户端手动设置auth_token
。实际上,这是不可能的,因为JavaScript的设计无法访问httpOnly
cookie。在客户端,你唯一需要做的就是确保cookie包含在所有未来的请求中,为了使用
axios
,你需要包含withCredentials: true
选项:https://axios-http.com/docs/req_config.注:当您将cookie设置为
httpOnly
时,您可能还需要在服务器上添加其他选项,例如secure: true
和domain: .example.com
。