我如何处理会话cookie设置,然后将其与NGINX auth_request一起使用



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

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

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

  1. 当用户尝试访问 docs.mydomain.com 时,将显示一个登录表单。在那里,他们输入他们的凭据,然后通过 AJAX 发送电子邮件/passwd,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 请求),我认为应该有更好的方法来做到这一点。关于如何改进这一点的任何想法?我们尝试实现此方法的方式是否存在安全影响?

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

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

希望它有帮助!

相关内容

  • 没有找到相关文章

最新更新