无法从NextJs中的getServerSideProps访问cookie

mzsu5hc0  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(154)

我在尝试将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

ar5n3qh5

ar5n3qh51#

我也经历过同样的事情。我可以从客户端读取令牌,但不能从getServerSideProps读取令牌。
解决这个问题的方法是在后端显式地设置res.cookie中的cookie域。假设前端域是frontend.webapp,后端域是backend.webapp。代码如下:

res.cookie('authtoken',token, { httpOnly: true, domain: '.webapp.com' })

相关问题