我在尝试将cookie从浏览器发送到nextJs服务器时遇到了一个问题,首先让我描述一下这个问题:
- 我的后端API是用Nodejs和express构建的,前端由Nextjs处理,当用户尝试登录时,令牌被存储为httpOnly cookie,为了获得登录的用户,我必须将cookie从我的前端发送到我的后端,所以我通过nextJs getServerSideProps函数在Context.req.headers.cookie的帮助下这样做,以便将此令牌发送到我的nodeJs后端。这是登录控制器(后端):
exports.login = catchAsync(async (req,res,next)=>{
// SOME CODE
const token = jwt.sign({id: user.id}, process.env.JWT_SECRET);
const cookieOption = {
expires: new Date(Date.now() + process.env.JWT_COOKIE_EXPIRES_IN*24*60*60*1000),
httpOnly: true,
secure : true,
sameSite: 'none',
// domain: '.herokuapp.com'
};
res.cookie('jwt', token, cookieOption);
res.status(200).json({
status: 'success',
data: {
user
}
})
});
这是我的getServerSideProps函数,在这个函数中,我尝试将token从nextJs发送到nodeJs服务器:
export async function getServerSideProps(context){
console.log(context.req.headers.cookie) // EMPTY OBJECT!
console.log(context.req.cookies) //EMPTY OBJECT TOO
let user
try{
const res = await fetch(`${url}/users/isLoggedin`, {
method: 'GET',
credentials:'include',
headers: {
'Access-Control-Allow-Credentials': true,
Cookie: req.headers.cookie
},
})
const data = await res.json()
if(!res.ok){
throw data
}
user = data
}catch(err){
return console.log(err)
}
return {
props: {
user,
}
}
}
我可以从浏览器直接发送令牌到nodeJs(客户端),但我不能从浏览器发送令牌到nextJs服务器,我不知道为什么,我已经尝试了许多解决方案,但没有一个为我工作。
*注意:后端和前端都部署到heroku
1条答案
按热度按时间ar5n3qh51#
我也经历过同样的事情。我可以从客户端读取令牌,但不能从
getServerSideProps
读取令牌。解决这个问题的方法是在后端显式地设置
res.cookie
中的cookie域。假设前端域是frontend.webapp
,后端域是backend.webapp
。代码如下: