我们正在尝试使用NGINX作为代理服务器实现简单的身份验证机制,并使用auth_request来保护一些静态文件。
当前验证过程如下所示:
当用户尝试访问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;
}
});
});
然后实际发送表单(使用GET),您可以看到请求中的已清除字段(电子邮件和密码)看起来有点难看。请求将发送到docs.mydomain.com/docs,它将检查login.otherdo.com.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请求获取会话令牌),我认为应该有更好的方法来做到这一点。有关如何改进的任何想法?我们试图实现这一目标的方式是否存在安全隐患?
答案 0 :(得分:0)
几天前,我对集群中的私有服务有相同的要求,我想出了类似的解决方案。我在客户端实现了一个带有AJAX请求的简单authentication server来进行身份验证并获取会话令牌。
就安全性而言,只要请求通过HTTPS,一切都应该没问题。然而我关心的是弱认证系统本身,它是一个简单的LDAP绑定操作......我决定用TOTP建立一个双因素认证,它解决了我担心的很大一部分问题。它对我来说足够安全,可以避免大多数攻击,或者至少在量子计算机出现之前!
希望它有所帮助!