PHP中的服务器端重定向

dra*_*ank 1 .net php java server-side

我有一个Java应用程序,我需要将我们现有的PHP网站与之集成.供应商希望我们进行服务器端重定向以允许安全身份验证和单点登录,但我不确定如何在PHP中执行此操作.供应商解释了工作流程如下:

  1. 用户点击PHP网站上的"打开应用程序"链接
  2. PHP应用程序访问Java应用程序上的页面,发送身份验证参数
  3. 如果成功,PHP应用程序会将标头发送回用户的浏览器,这会强制"重定向",否则PHP应用程序会显示错误

这将允许我们的PHP应用程序安全地与Java应用程序通信,并且客户端永远不必发送任何类型的身份验证.

据我所知,.NET和Java内置了这种功能,但我无法在PHP中找到这样做的方法.有任何想法吗?

UPDATE

我不是在谈论使用标题("位置:......"); 函数进行重定向.具有此服务器端重定向的踢球者是应用程序执行身份验证并将所有信息发送回客户端,以便客户端随后登录.使用标头("位置:...")只是强制浏览器运行别处.

更新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);
}
Run Code Online (Sandbox Code Playgroud)

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';
}
Run Code Online (Sandbox Code Playgroud)

restricted.php(限制页面)

session_start();
if($_SESSION['auth']) {
    echo 'Secret Token: '.$_SESSION['token'];
} else {
    echo 'Please log in';
}
Run Code Online (Sandbox Code Playgroud)

想法是用户想要最终到达'restricted.php'.'login.php'包含登录所需的代码.我想模拟的是用户在'login.php'上填写表单并将用户登录到'restricted.php'.

上面的代码片段在我的本地测试中一起工作(命中autologin.php重定向到restricted.php并打印出秘密令牌),但我似乎无法让它在跨应用程序中工作.该应用程序将在同一个域(https://domain.com/myapp,https://domain.com:1234/vendorapp).

我以前从未用任何语言做过这件事,我只是关注我的供应商告诉我他们做过的事情.显然他们以前从未处理过PHP,也不知道该怎么做.

men*_*kes 6

像这样:

header("Location: http://www.example.com/")
Run Code Online (Sandbox Code Playgroud)

但它必须先于任何其他代码...请参阅php.net


dec*_*eze 5

您只需header()像这样输出一个普通的 HTTP 重定向:

<?php header('Location: http://www.example.com/'); ?>
Run Code Online (Sandbox Code Playgroud)

重新更新

如果我理解正确,你需要这样做:

  1. 浏览器 POST 登录请求到 PHP 服务器
  2. PHP 脚本将登录信息以某种特定的形式打包给 JSP 应用程序
  3. PHP 脚本 POST(通过cURL)或SOAP或 JSP 应用程序所需的任何内容
  4. PHP接收响应并解析出必要的信息
  5. PHP 将标题和/或正文数据发送回浏览器

第 4 步,解析信息,取决于您发送和接收信息的方式。如果您通过 cURL 在标头中收到它们,则需要设置 CURLOPT_HEADERtrue并解析响应中的必要数据。这可能就像在第一个空行上拆分字符串一样简单或更复杂,这取决于您的具体情况。

如何在您的应用程序中登录用户也是您需要处理的事情。JSP 应用程序可能会处理实际的密码和用户名,并将您需要跟踪的某种令牌交还给您。