【发布时间】:2019-05-18 01:28:09
【问题描述】:
我的应用分为客户端和服务器。客户端是托管在 Now.sh 上的前端 Nextjs 应用程序,服务器是使用 Express 创建并托管在 Heroku 上的后端,因此域是 client-app.now.sh 和 server-app.herokuapp.com。
身份验证
身份验证系统基于 cookie,我使用 express-session 来实现它。这是我的快速会话配置
app.use(
session({
store:
process.env.NODE_ENV === "production"
? new RedisStore({
url: process.env.REDIS_URL
})
: new RedisStore({
host: "localhost",
port: 6379,
client
}),
name: "sessionID",
resave: false,
saveUninitialized: false,
secret: keys.SESSION,
unset: "destroy",
cookie: {
domain:
process.env.NODE_ENV === "production"
? ".client-app.now.sh"
: "localhost",
secure: process.env.NODE_ENV === "production",
httpOnly: true,
maxAge: 7 * 24 * 60 * 60 * 1000
}
})
);
Cors 是用“cors”包设置的:
app.use(
cors({
origin:
process.env.NODE_ENV === "production"
? process.env.CLIENT_URL
: "http://localhost:3000",
credentials: true
})
);
客户端配置了 Apollo,HttpLink 中的“凭据”设置为“包含”。
问题是带有会话 ID 的 cookie 在开发中设置正确,但在生产中设置不正确。这可能与我在不同域上托管客户端和服务器有关吗?
【问题讨论】:
-
我也有同样的问题。我在 Heroku 上托管我的应用程序 + 在 Heroku 上托管我的 NodeJS 服务器。在 localhost cookie 上设置得很好,但由于我将它托管在 Heroku 上,它不会再设置 cookie。我认识到在 NodeJS 中设置了 req.session.cookie,但在客户端浏览器上没有设置 cookie
-
@Jonathan 我的问题与此相同:github.com/expressjs/session/issues/600。这几天我也尝试在 Heroku 上推送前端,但没有成功,所以我最后一次尝试是使用自定义 Nextjs 服务器作为后端的主服务器,并且没有任何额外的配置它可以工作! TL;DR:我将客户端和服务器与他们自己的服务器分开。我也使用客户端服务器作为后端并将其托管在 Heroku 上(因此只有一个域),现在 cookie 可以工作了。不同的子域给了我问题。
-
顺便说一句,我很高兴这样说:我解决了这个问题!也许这听起来很奇怪,但只需删除 cookie 的
domain即可。所以不要为你的 cookie 设置域!这对我有用:)
标签: authentication cookies apollo express-session next.js