我正在按照以下说明进行操作https://developers.shopware.com/blog/2015/03/02/sso-with-nginx-authrequest-module/使用 Nginx 的模块保护一些代理的 Web 应用程序auth_request
。
我的部分中有以下几行server
。对于每个传入的请求,nginx 将向身份验证服务器 (auth.example.com) 发出授权请求。
auth_request /auth.php;
location = /auth.php {
internal;
proxy_pass https://auth.mydomain.com;
}
授权服务器是我自己写的。我写了一个 PHP 脚本,它只是检查 cookie 是否存在PHPSESSID
,并检查$_SESSION['username']
用户最初进行身份验证时设置的值。
但是,由于反向代理是内部代理,因此用户的PHPSESSID
cookie 不会被传递到授权服务器。
如何将PHPSESSID
cookie 从原始请求复制到内部授权请求?
故障排除尝试
这是我的auth.php
脚本。它使用两个不同的 4xx 状态代码进行调试。
<?php
if (! isset($_COOKIE['PHPSESSID'])) {
http_response_code(403); # No cookie
exit;
}
session_start();
# Check to see if the session username is set
if (! isset($_SESSION['username'])) {
http_response_code(401); # Unauthorized
exit;
}
else {
echo "OK " . $_SESSION['username'];
}
?>
我很确定该 cookie 没有被传递,因为当我在浏览器中访问授权 URL 时(https://auth.mydomain.com/auth.php),我得到了 200 状态代码。如果 cookie 不存在,我的脚本将返回 403。根据 Nginx 日志,它得到的就是这个。
我也尝试过以下location
配置,但没有成功。这个配置不使用请求internal
,而是常规的proxy_pass
。
location = /auth.php {
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass https://auth.mydomain.com;
}