【问题标题】:How does session/authentication work with nginx/NHPM/PHP-FPM?会话/身份验证如何与 nginx/NHPM/PHP-FPM 一起使用?
【发布时间】:2011-05-15 05:57:06
【问题描述】:

所以,我正在考虑使用带有 nginx-http-push-module 和 PHP-FPM 的 nginx 来构建应用程序,经过大量有趣的配置后,我让它能够正常处理 PHP 页面.

不过,我不明白会话应该如何工作——我看到的所有关于 nginx+NHPM 的示例都通过发布者-订阅者系统运行,但不清楚如果订阅者会发生什么频道将是有效的,对订阅者来说是独一无二的。例如,考虑一个为每个用户提供一个公共频道和一个私人频道的聊天系统。

现在,在传统的 PHP 设置中,您需要将 cookie 传递给 PHP,从那里查找会话,并根据用户是否经过身份验证来处理页面的其余部分,但使用 PHP-FPM和长轮询,它似乎不应该那样工作。

如果请求是未经身份验证的用户,我可以理解,您只需使用错误消息转储它们并终止来自客户端的长轮询,知道它是无效的,但是对于有效的请求,您几乎需要从客户端,在 PHP 中进行身份验证,然后断开连接但保持请求打开 - 我不确定这部分是如何工作的。

谁能解释它应该如何实现,如果可能的话最好举个例子?请注意,我不是在这里寻找 HTTP 基本身份验证,我需要根据 MongoDB 中的单独数据存储来查找身份验证。

【问题讨论】:

    标签: php session authentication nginx


    【解决方案1】:

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

    据我所知,NHPM 中身份验证的主要问题是 PHP 应用程序获得的传入连接通知绝对为零。您设置的 Comet 部分对 PHP 是只写的。

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

    nginx配置:

    • push_subscriber_concurrency first:这样频道只能由预期用户使用
    • push_authorized_channels_only 开启:并非绝对必要,但在我看来很好

    授权工作流程:

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

    请注意,如果您的应用程序应该可以从同一浏览器中的多个页面以相同的登录名访问,那么您需要为每个用户准备多个通道。

    【讨论】:

    • 是的,我想你已经证实了我的猜测。我在想你仍然会尝试使用传统的 cookie 对每个长轮询进行身份验证,并且非常考虑 PHP 中的常见情况,即你对每个请求进行身份验证,或者在无效身份验证时失败到错误页面,否则正常输出页面。但是使用 NHPM,您不会以这种方式输出响应,所以我想知道您如何使用 PHP-FPM 进行身份验证。
    猜你喜欢
    • 2020-08-29
    • 2014-01-24
    • 1970-01-01
    • 2020-10-06
    • 2016-04-24
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多