我们正在尝试使用NGINX作为代理服务器实现一个简单的身份验证机制,并auth_request来保护一些静态文件。
- 静态文档处于 docs.mydomain.com
- 使用电子邮件/密码生成会话令牌的 API 处于 login.otherdomain.com 状态(它将返回包含电子邮件和会话令牌的 JSON)
当前的身份验证过程如下所示:
-
当用户尝试访问 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; } }); });
-
然后表单实际上被发送(使用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 设置双因素身份验证,它解决了我的大部分担忧。对我来说,它足够安全,可以避免大多数攻击,或者至少在量子计算机出现之前!
希望它有帮助!