Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Preporuka za SOAP

[es] :: PHP :: Preporuka za SOAP

[ Pregleda: 2164 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 878
*.teol.net.



+148 Profil

icon Preporuka za SOAP13.02.2012. u 22:48 - pre 148 meseci
Treba da uradim neki projektni zadatak u okviru kojeg treba da realizujem SOAP server koji pruza interfejs ka bazi od nekih 12 tabela. Trenutno se troumim izmedju SOAPa uradjenog u PHP, NuSOAP-a i onog iz ZEND frameworka. Nemam nekog iskustva ni u jednom od ova 3, ali bih izbjegao ZEND jer trenutno nemam vremena da ulazim u novi framework, ali opet, ako vrijedi toga zasto da ne. :)

Moze neki savjet, sta odabrati, vec sam uradio neku demo verziju u NuSOAP i radi ok, ali autentifikaciju radim rucno parsirajuci XML sto mi se i ne svidja previse.

 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-3.sezampro.rs.



+33 Profil

icon Re: Preporuka za SOAP15.02.2012. u 10:47 - pre 148 meseci
Da bi koristio Zend_Soap, ne moraš i ne trebaš da ulaziš u ceo Zend Framework, jer on je, kao i npr. Symfony2, glue framework, component-based, što znači da nisi primoran da koristiš sve komponente framework-a, niti da ih koristiš na neki unapred definisan način, kao što je to slučaj kod full-stack framework-a.

Zend_Soap_Server komponenta poseduje jednu jako korisnu funkcionalnost - Autodiscovery. S njom npr. možeš da imaš sledeće:
Code:
if (isset($_GET['wsdl'])) {
    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('ServisKlasa');
    $autodiscover->handle();
} else {
    $soap = new Zend_Soap_Server("http://www.test.com/soap.php?wsdl");
    $soap->setClass('ServisKlasa');
    $soap->handle();
}

Dakle, endpoint tvog SOAP servisa je upravo stranica na kojoj ćeš imati ovaj kôd, u ovom primeru http://www.test.com/soap.php. Pritom, ako na tvoj SOAP servis dođe zahtev sa tim wsdl parametrom u URL-u, automatski će biti generisan XML WSDL-a kao output. S druge strane, na tom endpoint-u, Zend_Soap_Server osluškuje i reaguje na SOAP request-ove, a WSDL uzima upravo sa istog tog URL-a, samo sa pridodatim wsdl parametrom. Za "ServisKlasa" ti je pretpostavljam sve jasno, to je ta neka klasa koja sadrži metode koji će se mapirati u API tog tvog SOAP servisa.

Inače, interno, Zend_Soap_Server ne "izmišlja toplu vodu", već praktično samo wrap-uje onu PHP-ovu SoapServer klasu.

A ono što je tebe zanimalo je to pitanje autentifikacije... Ovde imaš primer kako je to realizovano u okviru jednog servisa baziranog na Zend_Soap_Server komponenti. Dakle praktično ono što klijent mora da uradi, jeste da pre svakog request-a, poziva taj neki authenticate metod kojeg bi ti definisao u svom servisu.

Drugo rešenje koje ja vidim je da npr. svaki metod tvog servisa formiraš na način da umesto više parametara, prihvata samo jedan, npr. $data, u kome bi bili svi parametri u key-value formi, ali bi kao poslednji parametar imao taj neki $signature. Npr. ovako bi izgledali potpisi metoda:
Code:
public function addUser($data, $signature) { ... }

A taj $signature bi bio recimo md5 od svih naziva $data parametara i njihovih vrednosti, sa dodatkom tog nekog tajnog ključa, koji bi bio praktično salt, a koji bi bio poznat samo tebi i tom nekom klijentu za kojeg praviš servis. Dakle ovako bi u slučaju tog metoda morao da bude formiran zahtev na tvoj servis:
Code:
$secretSalt = 'key111222333';

$signature = '';
foreach($data as $key => $val) {
    $signature .= $key . $val;
}

$signature = md5($secretSalt . $signature);

I onda bi se na servis slala ta dva parametra - $data i $signature. Naravno, na serverskoj strani bi onda morao da radiš istu stvar, dakle uzmeš taj $data niz, odradiš build-ovanje signature-a na isti način, i ako se taj $signature parametar kojeg ti je poslao klijent poklapa sa tim što si dobio, znaš da je zahtev validan.

Naravno, postoji i još jedan način za ostvarivanje autentifikacije i uopšte pitanja sigurnosti te API-based komunikacije (verovatno i još koji ), a on se svodi na enkriptovanje te komunikacije, na način da klijent enkriptuje sve parametre koje šalje, opet uz pomoć nekog tajnog ključa, a server radi dekripciju koristeći isti taj ključ. Dakle bukvalno kombinacija npr. PHP-ovih mcrypt_encrypt i mcrypt_decrypt funkcija. To je možda i najbolji mehanizam što se sigurnosti tiče.
 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Preporuka za SOAP15.02.2012. u 18:28 - pre 148 meseci
Ako ikako mozes da izbegnes SOAP i PHP posto to nije bas najsrecnije resenje. PHP kao klijent moze, ali da postavis SOAP PHP server koji ce da gadjaju Jave, si sarp-ovi i ostala velika bratija ne daj Boze...

Moja preporuka je implementacija REST web servisa (RESTful protokol - http://www.ibm.com/developerworks/webservices/library/ws-restful/)


Ali me bas zanima ako uspes da napravis ovaj PHP SOAP server/servis, da li ce raditi kako treba tj. da li ce druga okruzenja moci da ga koriste...
 
Odgovor na temu

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 878
*.teol.net.



+148 Profil

icon Re: Preporuka za SOAP16.02.2012. u 08:47 - pre 148 meseci
@Nikola Posa

Sjajno, super opis i smjernice, posebno taj dio oko autentifikacije sa saltom. U demo verziji saljem username i password svaki put i to u plain text formatu. Ovo nece biti neki sistem koji ce se realno koristiti, vec je samo jos jedan u nizu projektnih zadataka na fakultetu pa se neke stvari mogu i zanemariti. Ipak trebalo bi koliko toliko zadrzati dozu ozbiljnosti. :)

@Mister Big Time:

Pa u sustini imam slobodu da implementiram to kako hocu. Poenta je da imam neki web servis koji sam planirao da pisem u PHP jer mi to trenutno najbolje lezi sto se serverskih jezika tice. Klijentska aplikacija koja ce koristiti usluge servisa ce biti pisana u .NET platformi (C#).

Imao sam u vidu i rest, iskreno ne znam zasto je soap prevagnuo, valjda zato sto sa njim nisam uopste radio pa sam htio radom na tom projektu da steknem malo iskustva i sa njim.



 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Preporuka za SOAP16.02.2012. u 11:38 - pre 148 meseci
Citat:
peromalosutra:

Pa u sustini imam slobodu da implementiram to kako hocu. Poenta je da imam neki web servis koji sam planirao da pisem u PHP jer mi to trenutno najbolje lezi sto se serverskih jezika tice. Klijentska aplikacija koja ce koristiti usluge servisa ce biti pisana u .NET platformi (C#).

Imao sam u vidu i rest, iskreno ne znam zasto je soap prevagnuo, valjda zato sto sa njim nisam uopste radio pa sam htio radom na tom projektu da steknem malo iskustva i sa njim.



Probaj naravno, ako ti uspe javi. Posebna je komplikacija gadjati iz C#-a kao SOAP klijent PHP-ov SOAP server... iz Jave i moze da radi kulturno, ali kada ga majkrosoft nabudzi to ce da stuca gde god moze i ne moze!!! xD
Kod .NET-a osnovni problem je sto se pitaj Boga kako generise SOAP klijent i server, i uvek mu nesto smeta da bi proradilo... ako bi sam napisao klijenta bez poziva nekih nebuloza iz okruzenja sigurno da bi radilo i iz .NET-a.

Ako ti treba resenje koje zaista radi bez obzira na okruzenje - REST je jedina sigurna i univerzalna stvar.


 
Odgovor na temu

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 878
*.teol.net.



+148 Profil

icon Re: Preporuka za SOAP16.02.2012. u 17:59 - pre 148 meseci
Ok, onda definitivno idem sa RESTfull servisom. :)

Koji bi bio najbolji nacin za autentifikaciju? Imam 4 tipa korisnika (admin, ceo, manager, worker) i razliciti radnici imaju pristup razlicitim metodima.

Da li je ok da prilikom svakog upita na rest servis server salje kredencijale (username i password), ili da se to vrsi samo prilikom logovanja, a kasnije da se koristi neki token mehanizam?



 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Preporuka za SOAP18.02.2012. u 22:51 - pre 148 meseci
To je na tebi. Zavisi da li su ti ljudi totalno nepoznati (intertnet generalna populacija) ili su poznati - npr. neka druga firma koja ce da koristi servis npr. za B2B potrebe pa je krug korisnika samim tim dosta uzi.
Ja sam pravio ovo drugo, tj. gde je komunikacija putem web servisa izmedju samo dve strane, putem VPN-a. Svaki zahtev i svaki odgovor se salje preko VPN-a enkriptovano na nivou web servisa, kao i VPN na svom mreznom sloju koji ima enkripciju izmedju rutera.

Procitaj ovo.

http://blog.garethj.com/2009/0...tful-web-application-with-php/


Ovo je bas na temu kada je PHP server za REST:
http://www.lornajane.net/posts...rver-understanding-the-request
 
Odgovor na temu

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 878
*.teol.net.



+148 Profil

icon Re: Preporuka za SOAP19.02.2012. u 16:23 - pre 148 meseci
Slijedio sam savjet iz ranije linkovanog clanka da rest servis treba da bude stateless. To bi znacilo da se autentifikacija vrsi nezavisno prilikom poziva bilo koje metode na serveru.

Trenutno sam to rijesio tako sto se prilikom svakog zahtjeva ka rest serveru obavezno salju authUser i authPass parametri. Na osnovu ovoga se tacno zna koji korisnik upucuje zahtjev ka serveru i onda se dalje provjerava da li pripada odgovarajucoj grupi i slicno (neki primitivan ACL). Uz neku enkripciju veze izmedju klijenta i servera (https), racunam da bi ovo trebalo da bude dovoljno sigurno. Ipak je ovo kod koji se u praksi nece ni koristiti, vec je samo dio projektnog zadatka jednog od predmeta na fakultetu. :)

Evo primjer ulazne tacke servera, tj. neke vrste kontrolera. Sav kod sam pisao od nule i uz zurbu, tako da se vjerovatno moze naci dosta zamjerki.

Na primjer, nema razlike izmedju koristenja POST/GET/PUT/DELETE, ali nemam sada vremena da modifikujem postojeci kod, ostalo je jos dosta metoda koje moram da implementiram.

Code:

<?php

    define('IS_SERVER', true);

    require_once 'configuration.php';
    require_once 'libraries' . DS . 'response' . DS . 'response.php';
    require_once 'libraries' . DS . 'service' . DS . 'service.php';

    // get auth
    if (empty($_REQUEST['authUser']) || empty($_REQUEST['authPass']) ) {
        Response :: error('unauthorized');
        die();
    }
    
    // get requested method
    if (empty($_REQUEST['method'])) {
        Response :: error('bad_request');
        die();
    }
    
    // authenticate user    
    $user = Factory :: getUser();

    if ( ! $user->isValid()  ) {
        Response :: error('access_forbidden');
        die();
    }
    
    $method = $_REQUEST['method'];
    
    // check does requested method exists
    if ( !method_exists( "Service", $method ) ) {
        Response :: error('not_found');
        die();
    }
        
    // map query string parameters to function parameters and 
    // check are all parameters present
    $reflector         = new ReflectionMethod('Service', $method);
    $functionParams = $reflector->getParameters();
    $callParams        = array();
    foreach ($functionParams as $param) {
        $paramName = $param->getName();
        if ( !isset($_REQUEST[$paramName]) ) {
            $msg = "Missing $paramName parameter.";
            Response :: error('bad_request', $msg);
            die();
        }
        $callParams[] = $_REQUEST[$paramName];
    }

    // run method and return results
    $response = call_user_func_array( "Service::$method", $callParams );

    // check for errors
    if ($response === false) {
        Response :: error('internal_error');
        die();
    }    
    
    // encode response in XML    
    if ( is_array($response) ) {
        $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><response></response>");
        Response :: array2xml( $response, $xml );

        //echo $xml->asXML();

        // not required, but reformats XML to get nicer output
        $dom = new DOMDocument('1.0');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->loadXML($xml->asXML());
        echo $dom->saveXML();
    }
    


 
Odgovor na temu

[es] :: PHP :: Preporuka za SOAP

[ Pregleda: 2164 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.