我正在使用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());
同样,上面是一个非常简单的例子,我也是一个初学者。所以,如果你有好的建议,请让我知道