Nusoap在客户端和服务器端设置并获取标头

时间:2016-01-07 16:59:23

标签: php session authentication nusoap

我正在使用Nusoap开发一个简单的Web服务,并在添加身份验证时遇到问题。

目前我正在使用setCredentials()方法附加用户名和密码以在服务器端使用$ _SERVER [' PHP_AUTH_USER']来请求和获取它们。

它工作正常,但我不想为每次通话验证用户身份。所以我需要维持一个会话,根据我的研究,在第一次认证之后,服务器需要发送诸如会话ID'附加到响应标头,客户端应使用此会话ID'在随后的电话中。

但我不知道如何在请求和响应中设置和获取标头。 有人可以帮忙吗?

我对肥皂和会话真的很陌生,所以如果我的想法有任何问题,请指出。 非常感谢你。

1 个答案:

答案 0 :(得分:1)

最后,我自己想出来了。我使用了一个非常简单的实现,它绝对不安全,但它可能会帮助像我这样的初学者。

首先,通过观察Nusoap代码,我发现在客户端和服务器中设置和获取soap标头非常容易。

客户:

$client->getHeader();                 //return array containing header elements
$client->setHeaders('headerstring');

服务器:

$server->responseHeaders = 'headerstring';    //set response headers
$server->requestHeaders                       //get request headers 

其次,在使用用户名/密码进行首次身份验证后,我在会话中保存了用户名并将会话ID发送到客户端。然后客户端在下次调用时发送此会话ID,而不是用户名/密码。

服务器:

function someService (){
    global $server; 
    $valid = false; 
    $requestHeaders = $server->requestHeader;

    /*get session id from request header and open existing sid*/
    if(isset($requestHeaders['SessionToken'])){
            $sid = $requestHeaders['SessionToken'];
            session_id($sid);
    }

    session_start();

    /*if the user is not verified before, need to verify it*/
    if(!isset($_SESSION['user'])){
            $valid = verifyUser();
            if($valid){
                    $_SESSION['user'] = $_SERVER['PHP_AUTH_USER'];
            }
    }

    if($valid || isset($_SESSION['user'])){                                 //user verified or previously veirified.        
            $server->responseHeaders = '<SessionToken>'. session_id() .'</SessionToken>';
            /***
              some code goes here
            ***/
    }
    else{
            return new soap_fault(401,'', 'User is not verified!');
    }
}

客户端:

require_once "nusoap.php";
$client = new nusoap_client("auth.wsdl", true);

$authHeaders = $client->getHeader();
if(isset($authHeaders['SessionToken'])){
    $header = '<SessionToken>'. $authHeaders['SessionToken'] .'</SessionToken>';
    $client->setHeaders($header);
}
else{   
    $client->setCredentials('username','password','basic');
}

$result = $client->call("someService", array());

同样,上面是一个非常简单的例子,我也是一个初学者。如果您有好的建议,请告诉我