我正在使用Nusoap开发一个简单的Web服务,并在添加身份验证时遇到问题。
目前我正在使用setCredentials()方法附加用户名和密码以在服务器端使用$ _SERVER [' PHP_AUTH_USER']来请求和获取它们。
它工作正常,但我不想为每次通话验证用户身份。所以我需要维持一个会话,根据我的研究,在第一次认证之后,服务器需要发送诸如会话ID'附加到响应标头,客户端应使用此会话ID'在随后的电话中。
但我不知道如何在请求和响应中设置和获取标头。 有人可以帮忙吗?
我对肥皂和会话真的很陌生,所以如果我的想法有任何问题,请指出。 非常感谢你。
答案 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());
同样,上面是一个非常简单的例子,我也是一个初学者。如果您有好的建议,请告诉我