1

我们正在尝试实现一个简单的身份验证机制,使用 NGINX 作为代理服务器和 auth_request 来保护一些静态文件。

  • 静态文档位于docs.mydomain.com
  • 使用电子邮件/密码生成会话令牌的 API 在login.otherdomain.com中(它将返回带有电子邮件和会话令牌的 JSON)

当前的身份验证过程如下所示:

  1. 当用户尝试访问 docs.mydomain.com 时,他们将看到一个登录表单。在那里,他们输入他们的凭据,然后通过 AJAX 发送电子邮件/密码,API 会给我们一个会话令牌,我们将它存储在一个 cookie 中,类似这样(还注意到在 login.otherdomain.com 我有启用身份验证)。

    $("form").submit(function( event ) {
      $.ajax({
        async: false,
        url: "http://login.otherdomain.com/api/user_sessions",
        method: "POST",
        data: {
               user_sessions:
               {
                 email: $("#email").val(),
                 password: $("#password").val(),
               }
              },
        success: function(resp_hash) {
              $("form").reset() // Clearing form so email/pwd is not sent in POST request
              document.cookie = "x_api_session_id="+resp_hash.user_sessions.id;
             }
       });
     });
    
  2. 然后表单实际发送(使用 GET),您可以看到请求中清除的字段(电子邮件和密码)看起来有点难看。请求被发送到 docs.mydomain.com/docs,它将根据 login.otherdomain.com 检查会话令牌并验证它是否仍然有效,所有这些都使用 nginx auth_request ( https://developers.shopware.com/blog/2015 /03/02/sso-with-nginx-authrequest-module/)。像这样的东西:

    location /docs {
        auth_request /auth;
    }
    
    location = /auth {
        internal;
        proxy_pass $auth_api;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
        proxy_set_header X-Api-Session-Id $cookie_x_api_session_id;
    }
    

然后显示文档。我们仍然需要对错误消息进行干净的处理,但这首先是可行的。尽管如此,它仍然感觉很难看(特别是获取会话令牌的 AJAX 请求),我认为应该有更好的方法来做到这一点。关于如何改进的任何想法?我们尝试实现这一点的方式是否存在安全隐患?

4

1 回答 1

0

几天前我对访问集群中的私有服务有相同的要求,我想出了一个类似的解决方案。我在客户端实现了一个带有 AJAX 请求的简单身份验证服务器,以进行身份​​验证并获取会话令牌。

在安全方面,只要请求通过 HTTPS,一切都应该没问题。然而,我担心的是弱身份验证系统本身,它是一个简单的 LDAP 绑定操作......我决定使用 TOTP 设置一个双因素身份验证,它解决了我的大部分担忧。这对我来说足够安全,可以避免大多数攻击,或者至少在量子计算机出现之前!

希望它有所帮助!

于 2016-12-19T22:08:52.127 回答