【发布时间】:2009-12-30 22:50:03
【问题描述】:
我有一个 Java 应用程序,我需要将我们现有的 PHP 网站与之集成。供应商希望我们进行服务器端重定向以允许安全身份验证和单点登录,但我不确定如何在 PHP 中执行此操作。供应商解释了工作流程如下:
- 用户点击我们 PHP 网站上的“打开应用程序”链接
- PHP 应用程序在 Java 应用程序上点击一个页面,发送身份验证参数
- 如果成功,PHP 应用程序会将标头发送回用户的浏览器,这会强制“重定向”,否则 PHP 应用程序会显示错误
这将允许我们的 PHP 应用程序安全地与 Java 应用程序通信,并且客户端永远不必发送任何类型的身份验证。
据我了解,.NET 和 Java 内置了此功能,但我在 PHP 中找不到执行此操作的方法。有任何想法吗?
更新
我不是在谈论使用 header("Location: ...");执行重定向的功能。这种服务器端重定向的关键在于应用程序进行身份验证并将所有信息发送回客户端,以便客户端随后登录。使用 header("Location: ...") 只会强制浏览器运行其他地方。
更新 2
autologin.php(模拟用户通过 curl 登录外部应用)
// The login 'form' is at login.php
$ch = curl_init('http://domain.local/login.php');
// We are posting 2 variables, and returning the transfer just so it doesn't dump out
// Headers are processed by the callback function processHeaders()
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'processHeaders');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'username=user&password=pass');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Execute curl, close the connection, and redirect the user to a 'restricted' page
$response = curl_exec($ch);
curl_close($ch);
header("Location: http://domain.local/restricted.php");
function processHeaders($ch, $header) {
// Dump the response headers to the client
header($header);
strlen($header);
}
login.php(包含“登录”表单)
session_start();
if($_POST) {
if($_POST['username'] == 'user' && $_POST['password'] == 'pass') {
$_SESSION['auth'] = 1;
$_SESSION['token'] = md5(time());
} else {
echo 'Auth failed';
}
} else {
echo 'Invalid access type';
}
restricted.php(受限页面)
session_start();
if($_SESSION['auth']) {
echo 'Secret Token: '.$_SESSION['token'];
} else {
echo 'Please log in';
}
这个想法是用户希望最终访问“restricted.php”。 “login.php”包含登录所需的代码。我要模拟的是用户在“login.php”上填写表单并将用户登录到“restricted.php”。
上面的 sn-ps 代码在我的本地测试中协同工作(点击 autologin.php 重定向到 restricted.php 并打印出秘密令牌),但我似乎无法让它跨应用程序工作。这些应用程序将位于同一域中(https://domain.com/myapp、https://domain.com:1234/vendorapp)。
我以前从来没有用任何语言做过这件事,我只是偏离了我的供应商告诉我他们已经做过的事情。显然,他们以前从未处理过 PHP,也不知道该怎么做。
【问题讨论】:
-
重新更新:我不明白。您的意思是 PHP 应用程序将收到的标头从 Java 应用程序“转发”到浏览器吗?然后将适用相同的原则,您可以使用
header设置标题以及正文中所需的任何其他格式的任何其他信息。 -
他说的不是简单的服务器端POST吗?阅读问题的#2。
-
@deceze 那么使用带有 CURLOPT_HEADER => true 的 cURL 并将标头信息转储给用户工作吗?
-
使用不同的协议(http vs https)和不同的端口违反了跨域策略。
-
@Chris T 真该死。这可能就是为什么它在我的本地机器上运行良好,而不是当我在现实世界中尝试它时。有时,我讨厌安全:P
标签: java .net php server-side