- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在尝试通过代理(最初是 NGINX,现在是 AWS ALB)实现 HTTPS 以确保与我的 Node 服务器的连接安全时遇到了问题。我的 login
请求处理得很好,但 login
后的后续请求被标记为 isAuthenticated === false
,因此我的 Node 应用程序返回 401。
我知道 isAuthenticated === false
是由于浏览器中未设置 session cookie 引起的,但是我似乎无法弄清楚为什么未设置 session cookie (或发送?)。
我正在配置快速 session ,如下所示:
app.use(cookieParser('secret'));
app.set('trust proxy', 1);
// add & configure middleware
app.use(session({
name: 'session',
store: new redisStore(),
secret: 'secret',
resave: false,
saveUninitialized: false,
cookie: { httpOnly: true,
secure: true }
}));
我的 Node 应用程序位于 AWS Application Load Balancer 后面,该负载均衡器通过 HTTP 与应用程序进行通信,因此我已将信任代理
配置为 1。
我的 Passport 配置和本地策略就在下面:
// configure passport.js to use the local strategy
passport.use(new LocalStrategy(
{ usernameField: 'email' },
(email, password, done) => {
mysql.getConnection((err, conn) => {
conn.query('SELECT u.user_id, u.email, u.password, o.uuid FROM user AS u INNER JOIN organization AS o ON o.id = u.org_id WHERE email = ?;', [email], ( err, rows ) => {
if (err) throw err;
if (rows.length !== 1)
return done(null, false, { message: 'User does not exist.\n' });
else if (!bcrypt.compareSync(password, rows[0].password))
return done(null, false, { message: 'Incorrect password.\n' });
else{
return done(null, {user_id: rows[0].user_id, email: email, uuid: rows[0].uuid});
}
});
conn.release();
});
}
));
来自 react 客户端的请求是:
axios.post('https://sub.mydomain.com' + '/api/login', userObj, {withCredentials: true})
.then(res => {
if (res.status === 200) {
initUser(res.data, true);
}
else {
this.setState({errors: {password: 'Incorrect username or password'}})
this.props.history.push('/login');
}
})
.catch((e) => {
this.setState({errors: {password: 'Unable to login'}})
this.props.history.push('/login');
});
当发出请求时,我收到了 200 状态,其中包含我所期望的用户信息。请参阅下面来自 PostMan 的屏幕截图:
此外,这些是 Chrome 中的响应 header :
access-control-allow-credentials: true
access-control-allow-origin: https://sub.mydomain.com
content-length: 89
content-type: text/html; charset=utf-8
date: Tue, 12 Mar 2019 07:49:45 GMT
etag: W/"59-T0xi+VpB6A/MLCHMb8Qz3Pq9dwc"
status: 200
vary: Origin
x-powered-by: Express
在这个过程中, session cookie 似乎要么无法从 Node 应用程序发送,要么无法在浏览器中设置。
我在本地计算机上运行完全相同的程序,并且在浏览器中设置 cookie 没有问题。我的本地服务器和服务器之间的唯一区别是 Node 应用程序前面的 ALB,并且我在本地服务器上设置 secure: false
(因为我没有使用 HTTPS)。
仅供引用 - 我最初尝试在我的服务器上使用 NGINX proxy_pass 来处理 HTTPS 连接,但遇到了同样的问题。在未能找到 NGINX 的解决方案后,我尝试删除代理通行证并使用 AWS Application Load Balancer(我认为我的 NGINX 配置可能有问题)。这让我相信问题出在快速 session 配置上,因为它是这里的共同点,但是我可能遗漏了其他东西。
仅供引用 2 - 我尝试将 trust proxy
设置为 true
、1
、2
、3
等,还尝试将 secure
设置为 false
,还尝试将 httpOnly
设置为 false
- 以及上述内容的无数变体,但我似乎仍然没有在浏览器中获取 cookie。
仅供引用 3 - 我尝试删除代理并恢复到与 Node 应用程序的直接 HTTP 连接,但我仍然没有在浏览器(或 PostMan)中获取 cookie。
希望这里有人能指出我错过的一些事情,希望能解决这个问题。
提前致谢!
最佳答案
经过几天的调查,问题出在我的 Redis 服务器已终止且无法重新启动。 捂脸
未生成(或存储)sessionID,因为它无法连接到 Redis 存储以在服务器端保存 session 信息。
启动 Redis 服务器立即解决了问题,但是如果 express/passport 有一些详细的日志记录来通知用户这一点,那就太好了。
希望其他人发现这很有用!
关于node.js - 浏览器中未设置 Express session cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55120992/
我用运行 Node node --debug app OR node --debug-brk app 它有反应 debugger listening on port 5858 Express serv
这个问题在这里已经有了答案: What is the difference between (int *i) and (int* i) in context of both C and C++? [
我有一个应用程序,它通过消息队列将数据库写入命令分派(dispatch)给工作人员(数量非常大),因此无法保证它们的接收顺序。 我有两个 Node ,例如“Account”和“Media”。在此假设的
有没有办法在调用 ts-node 时将选项传递给 Node ?我正在尝试在 Node 中使用一个实验性功能,如果它能与 ts-node 一起使用,那就太好了。 这就是我目前正在做的事情: ts-nod
我有一个容器化的Node应用程序,它在DigitalOcean服务器上运行。当我更新服务器上的应用程序时,该应用程序必须关闭一小段时间。为了能够更新应用程序并避免停机,我目前正在阅读零停机时间部署/蓝
我正在编写一个 Node.js 应用程序。我正在使用 request 和 Cheerio 加载一组 URL 并获取该网站的大量信息,现在假设我想要获取的只是标题: var urls = {"url_1
如果不弹出以下错误,我无法安装任何 Node.js 模块。错误代码引用package.json文件。如果知道为什么会发生这种情况,我们将不胜感激。 最佳答案 这些不是错误,它们只是警告。一切都应该如此
如果我运行(从我的项目目录中): supervisor javascripts/index.js 我得到:/usr/bin/env: Node :没有这样的文件或目录 如果我运行: node java
我已遵循使用 Node-Inspector 的所有步骤 但是当我打开应用程序时,我在控制台上看不到任何脚本或日志。 我的应用程序在端口 4000 上运行。我认为唯一可能发生冲突的是端口 8080 上的
我在android中使用rxjava2,有时会遇到这样的问题: Observable.fromArray( // maybe a list about photo url in SD
我目前正在使用 Node 光纤来编写同步服务器端代码。我主要通过 try-catch block 进行错误处理,但外部库或其他小部分异步代码中总是有可能发生错误。我正在考虑使用新的域功能来尝试将这些错
看起来node-debug是node-inspector周围的一个shell?分别什么时候应该使用? 最佳答案 如果您安装node-debug,您只能访问node-debug命令。 如果您安装node
我目前正在代理后面工作,该代理不允许我执行此命令的 HTTP GET 请求阶段: Node node-sass/scripts/build.js 请求阶段: gyp http GET https://
听说node js可以用在服务端。我以前用过jsp。 jsp页面内部的java代码对客户端是不可见的。如果 Node js 只是 javascript,那么它如何对客户端不可见? 最佳答案 首先,No
我正在为 Node native 插件从 node-waf 构建迁移到 node-gyp 构建系统。 node-gyp 说它支持多个目标版本,但我在使用 node-gyp 时找不到如何指定目标 Nod
给定一个 $node ,我正在尝试在以下两种输出该 $node 的方式之间做出决定。 要么 $output = theme('node', $node); 或 node_build_content($
如果package.json中的窗口A打开一个新窗口B,node-main如何访问它?这是我的代码: package.json { "main": "index.html",
我试图在我的 xml 中的特定节点 ( ) 之前插入一个注释节点。这是它的方法: function test(xmlResponse) { var parser = new DOMParse
我正在尝试做npm install wrtc使用 Node 版本 16.14.0 但这还没有完成。它在给npm error code 1所以我试图将 Node 版本更改为以前的 lts 14.19.0
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
我是一名优秀的程序员,十分优秀!