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


Nusoap set and get headers in both client and server side

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

目前,我正在使用setCredentials()方法将用户名和密码附加到请求中,并使用服务器端的$_SERVER['PP_AUTH_USER']获取它们。

它工作得很好,但我不想每次调用都对用户进行身份验证。因此,我需要维护一个会话,根据我的研究,在第一次身份验证后,服务器需要在响应标头中发送类似"会话id"的内容,客户端应该在随后的调用中使用这个"会话id"。

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

我真的是肥皂剧和会话的新手,所以如果我的想法有什么问题,请指出。非常感谢。

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

首先,通过观察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());

同样,上面是一个非常简单的例子,我也是一个初学者。所以,如果你有好的建议,请让我知道