Jus*_*Lok 8 nginx node.js express express-session
当不使用安全 cookie true 设置时,我的应用程序用户登录工作正常。当我启用安全 cookie 时,登录似乎顺利通过,但似乎 cookie 未保存且用户未登录。
换句话说,这有效:
app = express();
app.use(session({
secret: 'secret code',
store: sessionStore,
resave: false,
saveUninitialized: false,
cookie: {
secure: false,
maxAge: 5184000000 // 60 days
}
}));
Run Code Online (Sandbox Code Playgroud)
这不起作用(用户无法登录):
app = express();
app.set('trust proxy');
app.use(session({
secret: config.cookieSecret,
store: sessionStore,
resave: false,
saveUninitialized: false,
proxy: true,
secureProxy: true,
cookie: {
secure: true,
httpOnly: true,
maxAge: 5184000000 // 60 days
}
}));
Run Code Online (Sandbox Code Playgroud)
在 cloudflare 和 nginx 背后。这是在我的 nginx 配置中:
location ~ / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:3000;
}
Run Code Online (Sandbox Code Playgroud)
从我读到的,我认为它应该有效。我错过了什么?
编辑:我正在使用有效的 ssl 证书运行 https。
Sto*_*rov 20
对我有用的设置组合:
proxy_set_header X-Forwarded-Proto $scheme;在express-session配置中:
server.use(
session({
proxy: true, // NODE_ENV === 'production'
cookie: {
secure: true, // NODE_ENV === 'production'
},
// everything else
})
);
Run Code Online (Sandbox Code Playgroud)如果使用 Heroku 的解决方案:
在 Heroku 中,所有请求都作为普通的http进入应用程序,但它们具有标头 X-Forwarded-Proto 以了解原始请求是http还是https。这会导致 express 看到非 ssl 流量,因此它在 Heroku 上运行时拒绝设置安全 cookie。Express 只会通过https发送安全 cookie 。您必须通过启用“信任代理”设置来告诉 express 信任 X-Forwarded-Proto 标头中的信息,即原始请求通过https。在定义我放置的 cookie 属性之前
app.set('trust proxy', 1);
Run Code Online (Sandbox Code Playgroud)
哪里1意味着信任第一个代理。1足以让我设置cookie: secure
Apache反向代理解决方案
对于那些正在寻找潜在解决方案并使用 Apache 反向代理的人:请确保在相应域的 VirtualHost 指令内的 ProxyPass 指令上方添加以下指令:
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Forwarded-SSL expr=%{HTTPS}
ProxyPass / http://localhost:8001/
ProxyPassReverse / http://localhost:8001/
Run Code Online (Sandbox Code Playgroud)
这一更改使我的 cookie 得以保留。
此外,正如其他人指出的那样,不要忘记将以下代码添加到您的生产(或使用代理的其他托管环境)快速配置中:
if (app.get('env') === 'production') {
app.set('trust proxy', 1); // trust first proxy, crucial
}
Run Code Online (Sandbox Code Playgroud)
最后,确保您的 cookie/会话设置正确。查看 Stoyan Borov 的答案以了解最低要求。我的设置方法如下:
app.use(session({
cookie: {
sameSite: 'lax', // lax or strict
secure: process.env.NODE_ENV === 'production', // Crucial
maxAge: 1000 * 60 * 60 * 24 * 30, // 30 days
},
proxy: true, // Crucial
resave: false,
saveUninitialized: true,
secret: 'Gotta love cookies',
store: yourSessionStore,
rolling: true,
}));
Run Code Online (Sandbox Code Playgroud)
这正是安全 cookie 的作用。在不安全的环境中,浏览器不会保存它,请阅读http://。
您需要添加 ssl sert,将所有 http 请求重定向到 https,然后 cookie 将保存在浏览器中。
在本地设置 https 很烦人,因此secure在配置/环境变量中设置,您还在源代码控制上设置为 false 并启用它以进行生产/暂存。
编辑:还启用重新保存,resave: true
| 归档时间: |
|
| 查看次数: |
10533 次 |
| 最近记录: |