javascript - Node.js可以验证PHP用户的 session 吗?

标签 javascript php mysql node.js websocket

我在做什么?
我试图在PHP应用程序和电话系统的REST API之间建立通信。
由于我的站点都是用PHP编写的,所以我决定通过对API进行cURL调用来使用PHP构建通信。
为了提高速度,用户和API之间有两种通信类型,我喜欢将它们分为两类
发送一次/接收一次例如,用户尝试拨打一个新电话号码“dial 800-123-4567”。API接受请求并返回一个交互id,以允许用户控制呼叫(即断开连接、静音、挂起…)
在这个通信中,每秒发送/接收一次,我将在用户会话和API之间创建“持久”连接。然后每秒钟,我都会检查API是否有新消息。在收到来自API的消息后,我必须更新用户的缓存,读取最新用户的缓存,最后向浏览器发送缓存数据。
有问题吗?HTTP是无状态的。
用户发送到web服务器的每个请求都会生成一个新的TCP连接。问题是,每当我查询API以获取新消息时,就会有一个新的TCP连接。平均每个用户在任何给定时间都需要大约200个TCP连接。所以如果我有300个用户在使用app/server,那么这就是为web服务器打开的大约60000个TCP连接。你可以清楚地看到,解决方案在这里没有很好的扩展性,服务器在我面前爆炸是一个时间问题。。。:(
另一个问题是PHP不是异步的,如果与API的通信时间较长或返回错误,则会导致问题。
FWIW,我尝试使用JavaScript SharedWorker来消除一些开销。我尝试过服务器发送事件,但用户仍然生成了太多到服务器的TCP连接。没什么首先的问题我只能减少一点连接。
Nodejs能帮上忙吗?
有几个人建议我使用Nodejs而不是PHP来完成这个任务。当然,我不会将我的PHP应用程序更改为Nodejs,因为这将是疯狂的,因为我的应用程序是巨大的。
我想考虑在PHP服务器和API服务之间运行nodejs服务器作为中间人。其思想是在节点服务器上运行一个WebSocket。然后,客户机将把任何通信传递给websocket,websocket随后将通信发送给服务器。从较高的层次来说,这听起来并不坏,但一旦深入挖掘,它似乎变得更加棘手。
Nodejs挑战
当用户登录到我的PHP应用程序时,我会验证他们的凭据,一旦他们进入,我就会创建一个会话,该会话存储在MySQL数据库中。要使会话有效,以下内容必须正确
IP地址必须与创建会话的IP地址匹配
代理数据也必须匹配(对于nodejs,我可以不使用它)
会话的空闲时间必须小于900秒。
为了让Nodejs开始通信,它必须首先创建到API的新连接。接受连接后,nodejs必须跟踪“由API接收”的以下数据
CSFR令牌
会话Id
Http Cookie
为了使Nodejs与API建立连接,它必须传递用户名、密码、服务器名、端口和站名。我把所有需要的信息都存储在MySQL数据库中,我可以很容易地使用PHP获得这些信息。
挑战在于NodeJS必须接受PHP会话,验证它,从数据库中提取API所需的信息,然后建立到API的连接。
问题
nodejs可以使用PHP会话验证用户吗?如果是,怎么办?
nodejs如何使用TCP连接来防止我过载服务器?

最佳答案

这是你的安排:

[User browser]  ->  [PHP]  ->  [Node.js]  ->  [API]

当用户的浏览器向PHP服务器发送请求时,请求中包含一个cookie—这个cookie的值之一是session id,PHP随后使用它来查找会话。session id的作用类似于密码,PHP将假定如果您有会话id,那么您就是发出该id的原始用户。
当PHP脚本与节点通信时,它需要作为请求的一部分传递该会话id。在Node中,您只需要在MySQL中查找会话表以查找相应的会话。
PHP会话数据存储为序列化的$_SESSION数组。要从中提取数据,您需要先取消序列化。有许多库可以提供此功能(例如https://github.com/naholyr/js-php-unserializehttps://github.com/kvz/phpjs/blob/master/functions/var/unserialize.js)。但是,如果会话数据简单且符合已知格式,则可以“手动分析”数据。

关于javascript - Node.js可以验证PHP用户的 session 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526053/

相关文章:

php - 从SQL数据库使用mysql和php获取信息

java - 如何将User_Id传递给android中的每个 Activity ?

mysql - 强制在表末尾插入新记录?

javascript - 多个脚本标签变量冲突?

javascript - 像异步 waterfall 一样执行 forEach

javascript - 为什么在浏览器中使用 ES6

Javascript reduce() 只考虑 2 个数组元素

php - PHP 数据结构书籍

mysql - 删除无效记录相关的自身问题

mysql - SQL 根据销售数量获取每个用户订购最多的前 3 个产品