使用PHP和SOAP生成webservice令牌头

使用PHP和SOAP生成webservice令牌头,php,web-services,soap,Php,Web Services,Soap,我试图使用一个请求身份验证的Web服务中的服务,但我无法生成时间戳和UsernameToken <wsu:Timestamp wsu:Id="TS-1C1ABE5282FC96252314981531909334"> <wsse:UsernameToken wsu:Id="UsernameToken-1C1ABE5282FC96252314981531792593"> 发送更正: <soapenv:Header> <wsse:Security

我试图使用一个请求身份验证的Web服务中的服务,但我无法生成时间戳和UsernameToken

<wsu:Timestamp wsu:Id="TS-1C1ABE5282FC96252314981531909334">
<wsse:UsernameToken wsu:Id="UsernameToken-1C1ABE5282FC96252314981531792593">

发送更正:

<soapenv:Header>
  <wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
     <wsu:Timestamp wsu:Id="TS-1C1ABE5282FC96252314981531909334">
        <wsu:Created>2017-07-20T22:07:01.999Z</wsu:Created>
        <wsu:Expires>2017-07-20T22:10:01.999Z</wsu:Expires>
     </wsu:Timestamp>
     <wsse:UsernameToken wsu:Id="UsernameToken-1C1ABE5282FC96252314981531792593">
        <wsse:Username>xxxxxxxxxxxxx</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">nrg2241zhN8HMAn1bg7OLCL/6eM=</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">ODgwODIzNDMz</wsse:Nonce>
        <wsu:Created>2017-07-20T22:07:01.999Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>
  </soapenv:Header>

2017-07-20T22:07:01.999Z
2017-07-20T22:10:01.999Z
XXXXXXXXXXXX
nrg2241zhN8HMAn1bg7OLCL/6eM=
ODgwODIzNDMz
2017-07-20T22:07:01.999Z
我正在使用下面的函数:

/**
 * This function implements a WS-Security authentication for PHP.
 *
 * @access private
 * @param string $user
 * @param string $password
 * @return SoapHeader
 */
function soapClientWSSecurityHeader($user, $password)
{
// Creating date using yyyy-mm-ddThh:mm:ssZ format
$tm_created = gmdate('Y-m-d\TH:i:s\Z');
$tm_expires = gmdate('Y-m-d\TH:i:s\Z', gmdate('U') + 180); //only necessary if using the timestamp element

// Generating and encoding a random number
$simple_nonce = mt_rand();
$encoded_nonce = base64_encode($simple_nonce);

// Compiling WSS string
$passdigest = base64_encode(sha1($simple_nonce . $tm_created . $password, true));

// Initializing namespaces
$ns_wsse = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$ns_wsu = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
$password_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
$encoding_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';

// Creating WSS identification header using SimpleXML
$root = new SimpleXMLElement('<root/>');

$security = $root->addChild('wsse:Security', null, $ns_wsse);

//the timestamp element is not required by all servers
$timestamp = $security->addChild('wsu:Timestamp', null, $ns_wsu);
$timestamp->addAttribute('wsu:Id', 'Timestamp-28');
$timestamp->addChild('wsu:Created', $tm_created, $ns_wsu);
$timestamp->addChild('wsu:Expires', $tm_expires, $ns_wsu);

$usernameToken = $security->addChild('wsse:UsernameToken', null, $ns_wsse);
$usernameToken->addChild('wsse:Username', $user, $ns_wsse);
$usernameToken->addChild('wsse:Password', $password, $ns_wsse)->addAttribute('Type', $password_type);
$usernameToken->addChild('wsse:Nonce', $encoded_nonce, $ns_wsse)->addAttribute('EncodingType', $encoding_type);
$usernameToken->addChild('wsu:Created', $tm_created, $ns_wsu);

// Recovering XML value from that object
$root->registerXPathNamespace('wsse', $ns_wsse);
$full = $root->xpath('/root/wsse:Security');
$auth = $full[0]->asXML();

return new SoapHeader($ns_wsse, 'Security', new SoapVar($auth, XSD_ANYXML), true);
}
/**
*此函数为PHP实现WS-Security身份验证。
*
*@access-private
*@param string$user
*@param string$密码
*@return-SoapHeader
*/
函数soapClientWSSecurityHeader($user,$password)
{
//使用yyyy-mm ddThh:mm:ssZ格式创建日期
$tm_created=gmdate('Y-m-d\TH:i:s\Z');
$tm_expires=gmdate('Y-m-d\TH:i:s\Z',gmdate('U')+180);//仅当使用timestamp元素时才需要
//生成和编码随机数
$simple\u nonce=mt\u rand();
$encoded\u nonce=base64\u encode($simple\u nonce);
//编译WSS字符串
$passdigest=base64_编码(sha1($simple_nonce.$tm_created.$password,true));
//初始化名称空间
$ns\u wsse=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$ns_wsu=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
$password\u type='1http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
$encoding\u type='1http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
//使用SimpleXML创建WSS标识头
$root=新的SimpleXMLElement(“”);
$security=$root->addChild('wsse:security',null,$ns\u wsse);
//并非所有服务器都需要timestamp元素
$timestamp=$security->addChild('wsu:timestamp',null,$ns\u wsu);
$timestamp->addAttribute('wsu:Id','timestamp-28');
$timestamp->addChild('wsu:Created',$tm\u Created,$ns\u wsu);
$timestamp->addChild('wsu:Expires',$tm\u Expires,$ns\u wsu);
$usernameToken=$security->addChild('wsse:usernameToken',null,$ns_wsse);
$usernameToken->addChild('wsse:Username',$user,$ns\wsse);
$usernameToken->addChild($wsse:Password',$Password,$ns\u wsse)->addAttribute($Type',$Password\u Type);
$usernameToken->addChild($wsse:Nonce',$encoded\u Nonce,$ns\u wsse)->addAttribute($EncodingType',$encoding\u type);
$usernameToken->addChild($wsu:Created’,$tm\u Created,$ns\u wsu);
//从该对象恢复XML值
$root->registerXPathNamespace('wsse',$ns\wsse);
$full=$root->xpath('/root/wsse:Security');
$auth=$full[0]->asXML();
返回新的SoapHeader($ns_wsse,'Security',新的SoapVar($auth,XSD_ANYXML),true);
}
我使用上述功能返回:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
               Id="Timestamp-28">
    <wsu:Created>2017-07-20T22:18:53Z</wsu:Created>
    <wsu:Expires>2017-07-20T22:21:53Z</wsu:Expires>
</wsu:Timestamp>
 <wsse:UsernameToken>
    <wsse:Username>XXXXXXXXXXXXXXXXXXX</wsse:Username>
    <wsse:Password
            Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
        XXXXXXXXXXXXXXXXXX
    </wsse:Password>
    <wsse:Nonce
            EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
        OTUxOTA4NDYz
    </wsse:Nonce>
    <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        2017-07-20T22:18:53Z
    </wsu:Created>
</wsse:UsernameToken>
</wsse:Security>

2017-07-20T22:18:53Z
2017-07-20T22:21:53Z
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
OTUxOTA4NDYz
2017-07-20T22:18:53Z

需要生成这两个令牌,但是使用这个函数,它们就不是了。

您应该尝试使用Github的WsSecurity项目,该项目通过促进soap头的构造和soap请求中的包含来处理这类事情。

您应该尝试使用Github的WsSecurity项目,该项目通过促进soap头来处理这类事情构造及其在soap请求中的包含

您可以共享您编写的代码吗?它使用WsSecurity生成了什么以及您期望的是什么?您可以分享您编写的代码吗?它使用WsSecurity生成了什么,以及您的期望是什么?