【问题标题】:How can I set up an automatic authentication layer in nginx?如何在 nginx 中设置自动身份验证层?
【发布时间】:2014-10-10 00:40:21
【问题描述】:

我正在一个公共域下构建应用程序生态系统,每个应用程序都在一个单独的子域下。我已经为生态系统构建了一个身份验证应用程序,但它要求每个其他应用程序都经过特殊配置才能使用它。有没有办法配置 nginx 来管理用户会话,可能将用户信息作为标头转发给各种应用程序?

【问题讨论】:

  • Cookies 是(子)域特定的,不会转移到另一个子(域)。也许您的问题是关于获得内部服务之间的访问权限?
  • 我将在各种子域下拥有一系列面向客户的应用程序,并可能用各种服务器端语言编写。目前,我设置了一个 OAuth2 提供程序来管理身份验证,但在每个新应用程序中实现客户端部分是乏味的,尤其是在我只想扔掉一些静态文件但仍需要保护它们的情况下。
  • 您有机会查看以下答案吗?

标签: authentication nginx


【解决方案1】:

让我向您展示一种可用于 Nginx 的跨应用程序身份验证的常见模式:

1) 构建名为 auth_service 的独立服务,根据需要独立于 Web 应用程序工作

2) 每个子域应用都有一个单独的位置来代理相同的身份验证服务

location = /auth {
  proxy_pass http://auth_service.localhost/authenticate;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header X-Original-URI $request_uri;
}

3) 单个 Web 应用使用“/auth”位置传递登录/通过(基于 POST 数据、标头或临时令牌)

4) 独立服务的处理程序“/authenticate”接受网络应用登录/通过,如果失败则返回 200 或 401

这种方法的根源是“/auth”位置位于每个自己的基于子域的应用程序上, 服务器端将调用分派到单个身份验证端点,可以有效地重复使用,您可以避免代码重复。

这个模块Auth Request默认不编译,自带源码。在使用之前,只需使用 --with-http_auth_request_module 选项编译 Nginx。

更新:从 Nginx 1.5.4 开始,这个插件是标准发行版,不需要单独编译。

【讨论】:

  • 这可能足够满足我的需求。由于它会代理现有的身份验证应用程序,因此它似乎适用于几乎任何应用程序。由于每个应用程序仍然必须单独管理其会话,这不一定是理想的,但它开始看起来像管理它的唯一方法是编写一个能够进行自己的会话管理的新 nginx 模块。
【解决方案2】:

我会建议一个自定义模块,它根据谁登录从数据库中获取数据,这样你就可以从一个中心点进行管理,并且可以根据数据库中的任何内容设置你想要的任何内容,从另一端同步具有身份验证源的数据库。

一个客户端总是有相同的登录接口,nginx总是以相同的方式与相同的认证源通信,您只需要管理数据库及其与认证源的接口。

client nginx database 设置客户端要去的地方和允许做的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2019-06-28
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多