NodeJS 为什么我的express服务器不向使用next.js/react的前端发送cookie?

yk9xbfzb  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(81)

所以我决定创建一个Next.js项目和一个Express服务器来进行passport身份验证(也许这不是一个好的选择?在本地开发时,我会输入我的登录信息,并在我的数据库中创建一个会话,passport会自动发送一个cookie,该cookie将在我的客户端设置,允许应用程序继续到 Jmeter 板页面。然而,在将后端上传到Heroku和vercel上的前端,在两者上配置ACM SSL,并使用以下cors和express-session设置后,cookie根本不会在客户端设置(我在网络选项卡中没有看到set-cookie头,应用程序将我重定向回登录,因为没有cookie)。
我的cors和express-session配置:

app.use(
  expressSession({
    secret: process.env.SECRET_COOKIE_SESSION_KEY,
    resave: false,
    saveUninitialized: false,
    cookie: {
      httpOnly: false,
      secure: true,
      sameSite: "none",
      path: "/", // Set the path to '/'
      maxAge: parseInt(process.env.MAX_COOKIE_AGE_MILLIS),
    },
    store: sessionStore, // Use the express-mysql-session store for session storage
  })
);

app.use(
  cors({
    origin: process.env.BASE_CLIENT_URL,
    methods: ["GET", "POST"],
    allowedHeaders: ["Content-Type", "Authorization"],
    exposedHeaders: ["X-Custom-Header", "Set-Cookie"],
    credentials: true,
    preflightContinue: true,
  })
);

字符串
注:httpOnly:真也不管用。此外,省略域标志并没有改变任何东西,但将其放在那里会导致网络选项卡中的警告,说明该域对于主机url无效。
以下是我的前端和后端应用程序供参考:
https://blood-frontend.vercel.app/login
https://bloodsense-backend-app-50ad20c4b656.herokuapp.com/
如果有什么不清楚的地方,请提前道歉。请让我知道如果任何更多的信息是必要的!

编辑:

为了确保清晰,下面是我的应用的登录功能的流程:

  1. Next.js客户端向我的服务器的登录路由发送请求。服务器返回status 200,登录客户机将其重定向到 Jmeter 板页面。登录路径如下:
router.post("/login", (req, res, next) => {
 const middlewareFunc = passport.authenticate("local", (err, user, info) => {
   if (err){
     console.log(err)
   }
   if (!user) 
     res.status(401).send(`Username or password is incorrect`);

   console.log(req.user) //prints user object as expected. expressSession creates a session on the mySQL DB too

   if (user) {
     req.login(user, (err) => {
       if (err) throw err;

       console.log(res.getHeader("Set-Cookie")); //prints undefined on production
       console.log(res.getHeader("set-cookie")); //undefined
       console.log(res.getHeaders()["set-cookie"]); //undefined

       //this response is sent
       res.status(200).send({
         success: true,
         message: "User Logged In Successfully",
       });
     });
   }
 });
 middlewareFunc(req, res, next);


});
1.我的 Jmeter 板页面通过SSR预先检查授权状态

export async function getServerSideProps(context) {
  // Perform authentication and authorization checks here

  const user = await checkAuthenticationWithCookie(
    context.req.headers.cookie
  );
  console.log("cookie->", context.req.headers.cookie); //undefined
  //user is also undefined
  if (!user) {
    console.log("The user was not authenticated properly"); //prints
    console.log(context.req.headers.cookie); //this prints undefined
    return {
      redirect: {
        destination: "/login",
        permanent: false,
      },
    };
  }

  return {
    props: {
      user: user,
    },
  };
}


1.我被重定向到登录页面,如 Jmeter 板getServerSideProps页面所示。

zdwk9cvp

zdwk9cvp1#

有几件事要调查。
您正在将httpOnly设置为false。你可能要重新考虑一下。
尝试在中间件投入生产之前将其添加到Express的index.js文件中

app.set('trust proxy', 1)
// or
app.enable('trust proxy')

字符串

相关问题