سؤال

أحاول الاتصال بشريك WS باستخدام usernameToken.أستخدم ذلك ws02 wsf_2.0.0 ضمن php5.2.x وهو رائع.نريد الآن الانتقال إلى حل مختلف يعتمد على php5.3، ولحسن الحظ يوفر ws02 علامة 2.1.0 متوافقة مع php5.3.أخصص وقتًا لقراءة الميزات والوثائق الجديدة لهذا الإصدار الجديد وخاصة فيما يتعلق بـ usernameToken.لقد فهمت أن هذا الإصدار يستخدم التوقيع فيما يتعلق بـ usernameToken من خلال شهادة ومفتاح خاص.أعتقد ب/ج من سياسة AsymetricTransportBinding.في حالتي لم أرغب في التوقيع على أي شيء من خلال الشهادة أو أي شيء آخر.قرأت أيضًا أن ws02 يوفر نوعًا من الاحتياطي في ملف xml منفصل لتجنب أي توقيع.

بعد قراءة العديد من المشاركات، أحتاج إلى بعض المساعدة من المجتمع، فأنا عالق تمامًا.

إليك الكود المستخدم لطلب WS في php5.3 - wsf 2.1.0 (باستخدام HTTP)

$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. أؤكد أن "إلى" الخاص بي يستخدم http وفقًا لتعريف wsdl

    WSDL: name port = "countulationServicehttpport" binding = "tns: calculationServicehttpBbinding" wsdlsoap: address location = "http: //www.xxx.xx/comparatorservices/calculationservice"/wsdl: port: 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.c في السطر 91 وفقًا لسجل التصحيح:

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;
    }

بمعنى نعم....رأس_الصابون كاذب..لكن لماذا؟هل هناك أي شخص ذكي ليشرح ما هو الخطأ؟

الملاحظة 1:لقد قمت بفحص السياسة المرسلة إلى الشريك WS من العمل (2.0.0) ويبدو أنه يتم استخدام AsymetricBinding ...وهو أمر غريب طالما أننا في الإصدار 2.0.0 لم نقدم أي شهادة أو مفاتيح.

الملاحظة 2:لقد حاولت أيضًا استخدام رمز اسم المستخدم المميز مع معلمات صفيف WSPolicy Object الكلاسيكية - لقد قمت بإنشاء شهادة x509 ومفتاح خاص ثم استخدم الوظائف لتحميل هذه الملفات واستخدم معلمات الصفيف لتحميلها في WSSecurity Constructor...لكنني أتلقى نفس الخطأ / يعتبر الاستنشاق أمرًا مؤلمًا حيث يتم تشفير البيانات أو شيء من هذا القبيل (والذي يبدو أنه طبيعي بهذه الطريقة)

الملاحظة 3:تم اختباره حاليًا على Ubuntu10.04-3LTS باستخدام حزم php المجمعة مسبقًا من apt-get

بلز مساعدة!

هل كانت مفيدة؟

المحلول

لقد وجدت المشكلة أخيرًا وأصلحت Rampart_in_handler.c:91

فالمسألة جاءت من الرد وليس من الطلب..لقد قمت بالتفتيش من خلال برنامج tcp sniffer وتم الرد من الشريك WS بدون أي صابون:Header.

متوافق أم لا مع المعايير، مع الإصدار الأخير (2.0.0) كان يعمل.لذلك قررت تعديل الكود الموجود في ملف Rampart_in_handler.c قليلاً لإرجاع النجاح في حالة فقدان رأس الصابون...

من وجهة نظري ويرجى تصحيحي إذا كنت مخطئا:

تمت إضافة الاختبار على استجابة SoapHeader بالتأكيد ب/ج للنقل غير المتماثل وحالة رمز اسم المستخدم الموقعة الجديدة.ومع ذلك، إذا أردنا استخدام رمز اسم المستخدم دون التوقيع ( من خلال السياسة الأساسية.xml ) و يتم الرد بدون أي صابون:Header ;ثم سيعود المتراس دائمًا بالفشل ...

وقمت أيضًا بتحليل كود php الموجود ضمن المجلد scripts/ فيما يتعلق بالطريقة التي يتعامل بها wsf مع الاستجابة ورأيت في هذا الملف: 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 حالة بدون أي رأس صابون...(لا يوجد فشل إذا كان رأس الصابون مفقودًا) غريب جدًا!؟

أخيرًا وليس آخرًا، وجدت خطأً غريبًا في كليهما wsf_wsdl_serialization.php و wsf_wsdl_deserialization.php ملفات.

على سبيل المثال، إذا كنت تخطط لإرسال و/أو استقبال المعلمات/القيم بسلسلة مثل تلك:

                            "110% Sigma of something" 

سوف يفشل وينشئ خطأً أثناء عملية التسلسل/إلغاء التسلسل!

والآن أتساءل بنفسي لماذا؟لكن من النظرة الأولى، بالتأكيد، "110% Sig.." تحتوي على "% 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