我们已经开发了通过http / 2协议提供服务的公司NodeJS应用程序,由于服务器需要根据客户端的IP(主要是一些有关电话的数据)向客户端发送事件,因此我们需要通过客户端的IP地址来识别客户端。
我可以通过req.connection.remoteAddress
成功获得客户端IP,但是有些客户端只能通过我们的代理服务器访问服务器。
我知道x-forwarded-for
标头,但这对我们不起作用,因为代理无法修改ssl连接中的http标头。
因此,尽管我可以从客户端获取IP并例如在登录过程中将其发送回服务器。
但是,如果我没记错的话,浏览器不会向javascript提供该信息,因此我们需要一种方法来首先获取该信息。
经过研究,我发现的唯一选择是从服务器获取,该服务器可以告诉我到达它的位置的IP。
当然,由于代理,我不能通过https。但是我可以轻松地启用http服务,仅用于服务客户端IP。
但是后来我发现,由于“混合的活动内容”问题,浏览器阻止了HTTPS连接的HTTP连接。
我了解了一下,发现可以得到“ mixed passive content”,并且我成功地通过<img>
将垃圾数据作为图像文件下载,但是当我尝试使用<object>
元素即使在MDN文档中也称其为被动,我仍然遇到“混合的有效内容”阻止问题。
是否有任何方法可以通过那个<img>
标签(破损的)来读取数据,还是我缺少使<object>
元素真正被动的东西?
任何其他实现我们目标的想法也将受到欢迎。
答案 0 :(得分:0)
最后我找到了解决方法:
正如我所说,我可以通过放置一个<img>
标签来执行http请求。
我无法做的是读取下载的数据,无论它是否是实际图像。
...但是事实是请求是发出的,我可以事先决定将其发送到哪个网址。
所以我要做的就是为每个提供服务的登录屏幕生成一个随机密钥,并且:
<img>
标签(可能是隐藏的),指向包含该ID的某些http网址。您的http服务器收到下载该图像的请求后,您就可以通过 x-forwarded-for 标头(当然是信任您的代理)来读取真实IP并解决该问题它所属的活动会话。
当然,您还必须在一段时间后清除密钥,而不管其是否被使用,以免导致内存泄漏或什至被恶意使用。
最终提示::这种方法的唯一缺点是,有一天浏览器默认也会开始阻止混合的被动内容。
基于这个原因,我实际上选择了双重策略方法。即:除了上述技术外,我还实现了一个HTTP重定向器,该重定向器的作用几乎相同:它将所有请求重定向到根路由(“ /”)到我们的https应用程序。但这是通过POST请求完成的,该请求包含一个先前与客户端真实IP相关联的密钥。
这样,万一有一天第一种方法停止工作,无论如何,用户都可以首先通过http访问。 ...实际上这就是我们要做的。但是,第一种方法虽然可以继续工作,但是如果用户决定从页面中为其添加书签(可以将书签添加到其https url),则可以避免出现问题。