簡體   English   中英

PHP中的服務器端重定向

[英]Server-Side Redirect in PHP

我有一個Java應用程序,需要與我們現有的PHP網站集成。 供應商希望我們進行服務器端重定向以允許安全身份驗證和單點登錄,但是我不確定如何在PHP中執行此操作。 供應商對工作流程的解釋如下:

  1. 用戶點擊我們PHP網站上的“打開應用程序”鏈接
  2. PHP應用程序在Java應用程序上訪問頁面,發送身份驗證參數
  3. 如果成功,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';
}

strict.php(受限頁面)

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

這個想法是用戶希望最終進入“ restricted.php”。 “ login.php”包含登錄所必需的代碼。我要模擬的是用戶填寫“ login.php”上的表單並將用戶登錄到“ restricted.php”。

上面的代碼片段在我的本地測試中一起工作(點擊autologin.php重定向到stricted.php並打印出秘密令牌),但是我似乎無法使其跨應用程序工作。 該應用程序將在同一個域( https://domain.com/myapphttps://domain.com:1234/vendorapp )。

我從來沒有用任何一種語言來做過此事,我只是從供應商告訴我他們已經做過的事情開始。 顯然,他們以前從未處理過PHP,也不知道該怎么辦。

像這樣:

header("Location: http://www.example.com/")

但是它必須在任何其他代碼之前...參見php.net

您只需輸出一個普通的HTTP重定向header()如下所示:

<?php header('Location: http://www.example.com/'); ?>

重新更新

如果我正確理解,則需要執行以下操作:

  1. 瀏覽器POST將請求登錄到PHP服務器
  2. PHP腳本以某種特定形式打包了JSP應用程序的登錄信息
  3. PHP腳本POST(通過cURL )或SOAP或JSP應用程序所需的任何東西
  4. PHP收到響應並解析出必要的信息
  5. PHP將標頭和/或正文數據發送回瀏覽器

步驟4,解析信息,取決於您如何發送和接收信息。 如果通過cURL在標頭中接收到它們,則需要 CURLOPT_HEADERtrue並從響應中解析出必要的數據。 這可能像在第一行空白處分割字符串一樣簡單,也可能更復雜,具體取決於您的具體情況。

還需要處理如何在應用程序中登錄用戶。 JSP應用程序可能會處理實際的密碼和用戶名,並將您需要跟蹤的某種令牌遞給您。

聽起來您正在尋找curl庫,該庫通常與PHP捆綁在一起。

http://php.net/manual/zh/book.curl.php

<?php
session_start();

// Receive username / password from $_POST

// Prepare CURL object for post

// Post u/p to java server

// Read response

if($success)
{
    header('Location: nextpage.php');
    $_SESSION['LoggedInTime'] = time();
    exit;
} 
else
{
    //display error
}

更新:

稍后,您可以檢查$_SESSION['LoggedInTime'] + 3600 > time()以查看他們是否仍在登錄。每次他們訪問登錄頁面時,請執行以下操作:

if($_SESSION['LoggedInTime'] + 3600 > time()) 
{
     $_SESSION['LoggedInTime'] = time() + 3600;
} 
else
{
     header('Location: /login.php?Message=session+expired');
     exit;
}

希望這可以幫助。

如果您想在網絡上集成php和java,則可能需要研究Quercus / Resin。 然后,您的PHP可以直接調用Java代碼。 由於它們在同一服務器上運行,因此Java代碼可以編寫任何cookie,設置任何會話或進行任何必要的設置處理。 http://www.caucho.com/resin-3.0/quercus/tutorial/module/index.xtp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM