Nodejs可以验证PHP用户的会话吗?

时间:2015-09-11 14:38:55

标签: javascript php mysql node.js websocket

我在做什么?

我正在尝试在PHP应用程序和电话系统的REST API之间建立通信。

由于我的网站都是用PHP编写的,所以我决定通过对API进行cURL调用来使用PHP构建通信。

为了让您快速,用户和API之间有两种类型的通信,我喜欢将它们分为两个不同的类别

  • 发送一次/接收一次例如,用户尝试拨打新的电话号码"拨打800-123-4567。" API接收请求并返回交互ID,以允许用户控制呼叫(即断开连接,静音,暂停......)。
  • 发送一次/每秒接收在此通信中,我将创建" persistent"用户会话和API之间的连接。然后每一秒,我都会检查API以获取新消息。收到来自API的消息后,我必须更新用户的缓存,读取最新用户的缓存,最后向浏览器发送缓存数据。

问题? HTTP是无状态的。

用户发送到Web服务器的每个请求都会生成一个新的TCP连接。这个问题是我每秒都会查询API以获得新的消息,我会有一个新的TCP连接。每个用户在任何给定时间平均需要大约200个TCP连接。因此,如果我有300个用户使用应用程序/服务器,那么这是为Web服务器打开的大约60,000个TCP连接。你可以清楚地看到解决方案在这里不能很好地扩展,服务器在我面前爆炸是一个时间问题...... :(

另一个问题是PHP不是异步的,如果与API的通信花费更长时间或返回错误,则会导致问题。

FWIW,我尝试使用JavaScript SharedWorker来消除一些开销。我每次尝试过Server-sent-events,但是用户仍然生成了太多与服务器的TCP连接。首先没有问题我只能减少一点连接。

Nodejs可以提供帮助吗?

我被几个人建议使用Nodejs而不是PHP来完成这项任务。当然,我不打算将我的PHP应用程序更改为Nodejs,因为我的应用程序非常庞大,这会很疯狂。

我想考虑将一个nodejs服务器作为PHP服务器和API服务之间的中间人运行。我们的想法是在节点服务器上运行WebSocket。然后,客户端将任何通信传递给websocket,然后websocket将通信发送到服务器。它听起来并不高,但一旦深入挖掘,它似乎变得越来越棘手。

Nodejs挑战

当用户登录我的PHP App时,我会验证他们的凭据,一旦他们进入,我就会创建一个存储在MySQL数据库中的会话。要使以下内容有效的会话必须正确

  • IP地址必须与创建会话的Ip匹配
  • 代理商数据也必须匹配(我可以在没有nodejs的情况下生活)
  • 会话的空闲时间必须少于900秒。

为了让Nodej开始通信,它必须首先创建一个到API的新连接。接受连接后,nodejs必须跟踪API接收的以下数据"

  1. CSFR令牌
  2. 会话ID
  3. Http Cookie
  4. 为了使Nodej与API建立连接,它必须传递用户名,密码,服务器名称,端口和站名。我将所有需要的信息存储到MySQL数据库中,我可以使用PHP轻松获得。

    挑战在于NodeJS必须接受PHP会话,对其进行验证,从数据库中提取所需的API信息,然后建立与API的连接。

    问题

    nodejs可以使用PHP会话来验证用户吗?如果是这样的话?

    nodejs如何使用TCP连接来阻止我超载服务器?

1 个答案:

答案 0 :(得分:2)

这是你的安排:

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

当您的用户的浏览器向您的PHP服务器发送请求时,该请求包含一个cookie - 该cookie的一个值是session id,然后PHP用它来查找会话。 session id就像一个密码,PHP会假设如果你有会话ID,那么你就是发给那个id的原始用户。

当您的PHP脚本与Node通信时,它需要传递该会话ID作为请求的一部分。在Node中,您需要在MySQL中查找会话表以进行相应的会话。

PHP会话数据存储为序列化的$_SESSION数组。要从中提取数据,您需要先将其取消序列化。有许多库可以提供此功能(例如https://github.com/naholyr/js-php-unserializehttps://github.com/kvz/phpjs/blob/master/functions/var/unserialize.js)。但是,如果会话数据很简单并且符合已知格式,您可以“手动解析”数据。