nginx/NHPM/PHP-FPM是如何处理会话/身份验证的?

6
因此,我正在考虑使用nginx、nginx-http-push-module和PHP-FPM来构建一个应用程序,在进行了大量的配置之后,我成功地处理了PHP页面。
然而,我不明白的是会话应该如何工作——我看到的所有nginx+NHPM的示例都通过发布者-订阅者系统运行,但如果订阅者通道将有效地唯一属于订阅者,那么应该发生什么情况并不清楚。例如,考虑一个具有公共频道和每个用户的私人频道的聊天系统。
现在,在传统的PHP设置中,您将传递cookie到PHP,从那里查找会话,并根据用户是否经过身份验证来处理页面的其余部分,但是对于PHP-FPM和长轮询,它似乎不应该像这样工作。
我可以理解如果请求是非经过身份验证的用户,您只需使用错误消息将其丢弃并终止客户端的长轮询,因为知道它无效,但是对于有效的请求,您几乎需要从客户端轮询,然后在PHP中进行身份验证,然后断开但保持请求打开——我不确定那部分是如何工作的。
有人能解释应该如何实现吗,最好附带一个示例?请注意,我在这里寻找HTTP基本身份验证,我需要根据存储在MongoDB中的单独数据进行身份验证。
1个回答

2

声明:我无法清楚地理解您的第四段。

据我所知,NHPM中身份验证的主要问题是PHP应用程序绝对不会收到关于传入连接的任何通知。您设置的Comet部分仅供PHP写入。

以下是可能的解决方案,我将在接下来的几天尝试这个方案。

nginx配置:

  • 首先推送订阅者并发性:以便该频道只能由预期的用户使用
  • 仅授权推送频道:不是严格必需的,但我认为有好处

授权工作流程:

  1. 客户端通过老式请求发送凭据
  2. 服务器进行身份验证,并生成令牌(频道ID)。创建频道并响应令牌。
  3. 客户端尝试打开长轮询到给定的频道。
    • 如果失败(可能是因为频道被劫持),则告诉服务器该频道无效。请注意,在此处我们使用老式请求,因此可以使用任何身份验证方法。服务器将删除该频道。回到步骤二。
    • 如果连接成功(您可能不知道这一点,只知道它没有失败),则可以认为该频道已经通过身份验证。

请注意,如果您的应用程序应该在同一浏览器中的多个页面上使用相同的登录,则需要为每个用户准备多个频道。


是的,我认为你已经确认了我的猜测。我在想您是否仍然会尝试使用传统cookie在每个长轮询中进行身份验证,并且非常关注PHP中的通常情况,即您在每个请求上进行身份验证并且在无效身份验证时失败到错误页面,否则按正常方式输出页面。但是对于NHPM,您不会以那种方式输出响应,所以我想知道您如何与PHP-FPM进行身份验证。 - Arantor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接