我们正在尝试实现一个简单的身份验证机制,使用 NGINX 作为代理服务器和 auth_request 来保护一些静态文件。
- 静态文档位于docs.mydomain.com
- 使用电子邮件/密码生成会话令牌的 API 在login.otherdomain.com中(它将返回带有电子邮件和会话令牌的 JSON)
当前的身份验证过程如下所示:
当用户尝试访问 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.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 请求),我认为应该有更好的方法来做到这一点。关于如何改进的任何想法?我们尝试实现这一点的方式是否存在安全隐患?