我有一个 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?
发生这种情况是因为该代码不是在客户端运行。 您必须手动获取并将cookie包含在标头/cookie中。
我还在这段代码中看到了一个不好的做法。
而不是
let res = await fetch(
process.env.NEXT_PUBLIC_BACKEND_URL + "/authentication/check",
{ credentials: "include" }
);
您应该在此处复制粘贴相同的代码(或为此创建一个函数),以查看身份验证状态,如下所示:
let res = checkAuth(token)