1

我正在尝试使用 WSO2 的 PHP Web 服务框架来保护 SOAP 请求。

这是我的要求:

$reqPayloadString = <<<XML
       <echo>
       <echoRequest>TEST</echoRequest>
       </echo>
XML;


$reqMessage = new WSMessage($reqPayloadString,
                                array("to" => "http://localhost/service/echo",
                                      "action" => "echo"));

$sec_token = new WSSecurityToken(array("user" => "myusername",
                                       "password" => "mypassword",
                                       "passwordType" => "Digest"));  

$client = new WSClient(array("useWSA" => TRUE,
                             "policy" => new WSPolicy(file_get_contents("policy.xml")),
                             "securityToken" => $sec_token));

$resMessage = $client->request($reqMessage);

但是,我收到以下错误:

Missing wsse:Security header in request

我应该如何wsse:Security在上面的请求中设置标头?

4

2 回答 2

1

您可能希望在 WSSecurityToken 构造函数中添加 "ttl" => 300,因为您没有将 WSPolicy 与数组一起使用,而是与策略文件一起使用。所以你的代码应该是这样的:

$sec_token = new WSSecurityToken(array("user" => "myusername", 
                                       "password" => "mypassword", 
                                       "passwordType" => "Digest", 
                                       "ttl" => 300 ));

至少这是手册第 8.1 章所述:http ://wso2.org/project/wsf/php/2.1.0/docs/security_manual.html#1

如果您想拥有 UsernameToken,则必须设置用户、密码和密码类型(可选)选项。对于 TimeStamp,必须设置 ttl 选项。

一些附加信息:

您的 passwordType 是 Digest,这意味着接收者需要 wsse:Nonce 和 wsu:Created(时间戳)在标头中都可用。如果您使用 passwordType is Text,那么您不需要指定 ttl,因为您不需要在这种情况下提到的两个元素。

我不确定 PHP WSSecurityToken 类是否负责添加 wsse:Nonce。可能是根据提供的政策处理的。

无论如何,在 Digest 的情况下,您的策略应该如下所示:

<sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:HashPassword/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>

来源:http ://blog.rampartfaq.com/2009/08/how-to-ask-for-hashed-password-in.html

注意:我还没有尝试过(还)。我从未使用过 WSO2 的 PHP Web 服务框架。

于 2012-02-21T15:49:00.717 回答
0

不幸的是,我无法解决这个问题。我已经尝试了@Peter 在他的回复中提出的建议。

我现在使用PHP/Java Bridge和本机 Java 类来发出安全请求。

于 2012-03-02T10:23:48.503 回答