質問

usernameTokenを使用してパートナー WSを呼び出そうとします。私はそのws02wsf_2.0.0のためにphp5.2の下で使用します。xとそれは岩。今、私たちはphp5.3に基づいて別のソリューションに移行したいのですが、幸いなことにws02はphp5.3と互換性のある2.1.0タグを提供しています。私はこの新しいリリースの新機能とドキュメント、特にusernameTokenに関するものを読むのに時間がかかります。このリリースでは、証明書と秘密鍵を介したusernameTokenに関する署名を使用していることを理解しました。私はAsymetricTransportBindingポリシーのb/cを推測します。私の場合、証明書などで何かに署名したくありませんでした。また、ws02は、署名を避けるために別のxmlファイルに一種のフォールバックを提供することも読みました。

多くの投稿を読んだ後、フォーラム私は完全に立ち往生しているコミュニティb/cからいくつかの助けが必要です。

Php5.3-wsf2.1.0(HTTPを使用)でWSを要求するために使用されるコードは次のとおりです。

$policy   = new \WSPolicy( $policy ); ( $policy is the one from the call_back folder with a file_get_contents() )

$security = new \WSSecurityToken( array(
  'user'                    => 'my_username',
  'password'                => 'my_password',
  'passwordType'            => 'Digest',
  'ttl'                     => '300'
));

$this->oSoapClient = new \WSClient( array(
  wsdl:          http://www.xxx.xx/comparatorservices/CalculationService?WSDL
  to:            http://www.xxx.xx/comparatorservices/CalculationService
  useWSA:        true
  useSOAP:       1.1,
  policy:        $policy,
  securityToken: $security
));

$proxy = $this->oSoapClient->getProxy();
$response = $proxy->wykonajKalkulacje( $MySuperRequestObject );

このステップで :

  1. デバッグトレースを有効にしました(ログレベル4)
  2. 私の"to"がwsdl定義にhttp accoringを使用していることを確認します

    wsdl:ポート名="C A L Culationservicehttpport"binding="tns:C A L Culationservicehttpbinding" wsdlsoap:アドレスの場所="http://www...○○○○○○○○○xx/comparatorservices/CalculationService" /wsdl:port

今デバッグログから私はこれをキャッチします :

[Wed Jul 25 05:22:53 2012] [error] rampart_in_handler.c(91) [rampart]SOAP header cannot be found.
[Wed Jul 25 05:22:53 2012] [error] phase.c(224) Handler RampartInHandler invoke failed within phase Security
[Wed Jul 25 05:22:53 2012] [error] engine.c(657) Invoking phase Security failed
[Wed Jul 25 05:22:53 2012] [error] engine.c(262) Invoking operation specific phases failed for operation __OPERATION_OUT_IN__
[Wed Jul 25 05:22:53 2012] [error] /home/agruet/08_KRK_sources/wso2-wsf-php-src-2.1.0/src/wsf_wsdl.c(1226)      [wsf_wsdl] Response envelope not found

だから私の最初のアイデアは、トラフィック、特に作業中のSOAPヘッダー(wsf_2.0.0/php5.2)をスニッフィングすることでした。x)と壊れた(wsf_2.1.0/php5.3)

ここに2.0.0(作業)があります

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <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:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>my_username</wsse:Username>

            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">
              hashed(my_password)
            </wsse:Password>

            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-26T20:40:26.991Z</wsu:Created>

        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

そして、2.1.0(動作していない/壊れている)

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

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

            <wsse:Username>my_username</wsse:Username>
            <wsse:Password
                Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">hashed(my_password)</wsse:Password>
            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-25T00:44:56.758Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

あなたが見ることができるように、唯一の違いはwsse:Security名前空間から来ています。(欠落しているxmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/)

そして、それはすべてです。..

Rampart_in_handlerを検査します。デバッグログによると、91行目のcは言った :

soap_header = axiom_soap_envelope_get_header(soap_envelope, env);
    if(!soap_header)
    {
        /*No SOAP header, so no point of proceeding. FAIL*/
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart]SOAP header cannot be found.");
        return AXIS2_FAILURE;
    }

意味はええ。...soap_headerはfalseです。.しかし、なぜですか?何が悪いのかを説明するために賢い人はいますか?

ノタ1:作業中(2.0.0)からパートナー WSに送信されたポリシーを検査しましたが、AsymetricBindingが使用されているようです。..2.0.0で証明書やキーを提供していない限り、奇妙です。

ノタ2:私はまた、古典的なWSPolicyオブジェクトの配列paramsで署名されたユーザー名トークンを使用しようとしました-私はx509証明書とprivatekeyを作成し、これらのファイルをロード..しかし、私は同じエラー/スニッフィングを受け取りますが、データが暗号化されているか、そのようなものです(この方法では正常であるように見えます)

ノタ3:現在、Apt-getからプリコンパイルされたphp packgesでUbuntu10.04-3LTSでテストされています

PLZヘルプ!

役に立ちましたか?

解決

私は最終的に問題を見つけ、rampart_in_handlerを修正しました。c:91

問題は、要求からではなく、応答から来ていました。..私はtcpスニファを介して検査し、パートナー WSからの応答はsoap:ヘッダーなしで行われました。

標準に準拠しているかどうか、最後のリリース(2.0.0)では動作していました。だから私はrampart_in_handlerのコードを少し微調整することにしました。soapヘッダーの場合に成功を返すcファイルが欠落しています。..

私の意見では、私が間違っている場合、PLZは私を修正します :

SoapHeader応答のテストは、asymetricBindingトランスポートのb/cと新しい署名されたusernametokenケースに確実に追加されました。ただし、署名せずにusernametokenを使用する場合( 基本方針を通じたものです。xml ) 応答はsoap:ヘッダーなしで行われます ;その後、rampartは常に失敗を返します。..

また、wsfが応答を処理する方法に関して、scripts/フォルダーの下のphpコードを分析し、このファイルで確認しました : wsf_wsdl.php 関数の下で wsf_process_response() :

if($response_header_string && !empty($response_header_string)) {
    $header_dom = new DomDocument();
    $header_dom->preserveWhiteSpace = FALSE;
    $header_dom->loadXML($response_header_string);
}

意味php側では、データが受信されると、wsf/phpはsoapHeaderなしでケースを想定します。..(soapHeaderが欠落している場合は失敗はありません)超奇妙な!?

最後に、私は両方に奇妙なバグを見つけました wsf_wsdl_serialization.phpwsf_wsdl_deserialization.php ファイル。

たとえば、次のような文字列を使用してparams/valuesを送受信する予定がある場合は、次のようにします :

                            "110% Sigma of something" 

シリアル化/シリアル化解除プロセス中に失敗してsegfaultが作成されます!

今、私はなぜ自分自身を疑問に思っていますか?しかし、最初のビューでは、確かに、"110%Sig。."contain"%S"そしてそれは"%s"のかなり閉じています。..

このバグはここで言及されているものだと思います :

http://old.nabble.com/WSF-PHP-server-segfault-on-wsf_wsdl_serialization.php---td24329956.html

私がSをDまたは何か他のもので変更すると、それは動作します。..

どのような痛み。..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top