The*_*olf 6 authentication cookies apollo express-session next.js
我的应用程序分为客户端和服务器。Client 是托管在 Now.sh 上的前端 Nextjs 应用程序,Server 是其后端使用 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
}
})
);
Run Code Online (Sandbox Code Playgroud)
Cors 是用“cors”包设置的:
app.use(
cors({
origin:
process.env.NODE_ENV === "production"
? process.env.CLIENT_URL
: "http://localhost:3000",
credentials: true
})
);
Run Code Online (Sandbox Code Playgroud)
客户端配置了 Apollo,HttpLink 中的“凭据”设置为“包含”。
问题是具有会话 ID 的 cookie 在开发中正确设置,但在生产中未正确设置。这可能与我在不同域上托管客户端和服务器的事实有关吗?
我的生产节点服务器位于反向代理之后。这会导致节点不信任代理,因此不会设置 cookie。
我必须在生产中启用信任第一个代理。
app.set('trust proxy', 1) // trust first proxy
更多信息请查看express-session
关于该主题的文档。
经过很长时间尝试解决这个问题,我刚刚找到了解决方案:
所以我有,
app.use(session({
secret: secret,
saveUninitialized: false,
resave: false,
cookie: {
domain: clientDomain,
secure: true
}
}));
Run Code Online (Sandbox Code Playgroud)
我删除了所有 cookie 对象,这解决了我的问题:
app.use(session({
secret: secret,
saveUninitialized: false,
resave: false
}));
Run Code Online (Sandbox Code Playgroud)
浏览器似乎不需要帮助来获取cookie。
归档时间: |
|
查看次数: |
5604 次 |
最近记录: |