所以我决定创建一个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/的
如果有什么不清楚的地方,请提前道歉。请让我知道如果任何更多的信息是必要的!
编辑:
为了确保清晰,下面是我的应用的登录功能的流程:
- 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页面所示。
1条答案
按热度按时间zdwk9cvp1#
有几件事要调查。
您正在将httpOnly设置为false。你可能要重新考虑一下。
尝试在中间件投入生产之前将其添加到Express的index.js文件中
字符串