下一个中间件不传递服务器返回的cookie

问题描述 投票:0回答:1

我有一个 Django 后端,它在成功登录时返回 httpOnly cookie。访问 Next 应用程序中的受保护路由需要此 cookie。我有一个中间件,用于检查是否正在访问受保护的路由 - 如果是,则进行 api 调用以确保用户可以访问所述页面。这是代码 -

export default middleware = async (request) => {
  //check auth status if user tries to access protected routes
  if (PROTECTED_ROUTES.includes(request.nextUrl.pathname)) {
    try {
      let res = await fetch(
        process.env.NEXT_PUBLIC_BACKEND_URL + "/authentication/check",
        { credentials: "include" }
      );

      //Go to login page if not signed in
      if (res.status !== 200) {
        return NextResponse.redirect(new URL(PAGE_ROUTES.LOGIN, request.url));
      }
    } catch (error) {
      //In case API fails or there is an exception, send them to login page
      return NextResponse.redirect(new URL(PAGE_ROUTES.LOGIN, request.url));
    }
  }
};

登录后,我可以在 Chrome 开发工具下的应用程序选项卡中看到 cookie。但是当我尝试访问受保护的路由时,我会被发送回登录页面,因为 cookie 没有被发送。为什么会发生这种情况?如何让中间件传递客户端浏览器中保存的cookie?

next.js cookies middleware
1个回答
0
投票

发生这种情况是因为该代码不是客户端运行。 您必须手动获取并将cookie包含在标头/cookie中。

我还在这段代码中看到了一个不好的做法

而不是

      let res = await fetch(
        process.env.NEXT_PUBLIC_BACKEND_URL + "/authentication/check",
        { credentials: "include" }
      );

您应该在此处复制粘贴相同的代码(或为此创建一个函数),以查看身份验证状态,如下所示:

  let res = checkAuth(token)
© www.soinside.com 2019 - 2024. All rights reserved.