Instalando o WSO2 Web Services Framework for PHP (2.0.0)
Como eu disse anteriormente, em Consumindo um serviço seguro utilizando PHP, vou mostrar uma das maneiras para instalar o framework que o pessoal do WSO2 disponibiliza para criação e consumo de serviços em PHP, conhecido como: WSO2 Web Services Framework for PHP.
Na página de downloads do WSO2 Web Services Framework for PHP, é possível escolher entre 3 opções de instalação, então exemplificar a fundo apenas uma e colocar uma breve descrição das outras.
Binary Distribution
É o framework já compilado e com a DLL dentro que serve para as pessoas que a utilizarão em ambientes Windows, não terá muito trabalho, apenas colocar a DLL na pasta correta e configurar o seu php.ini. Essa é a opção mais prática - na minha opinião - para Windows (deixarei essa para uma próxima, não tenho ambiente para isso - ainda).
PECL Distribution
Em teoria é a mais fácil de todas. Mas por que "em teoria"? Passei dois dias realizando diversas configurações na minha máquina para que isso funcionasse corretamente, perguntei no fórum se alguém poderia me ajudar a solucionar, mas desisti. Parti para a maneira "clássica", o famoso CMM, que descrevo abaixo.
Source Distribution
Essa versão é o código-fonte do WSO2 Web Services Framework for PHP (aberto, hein!) e aqui temos duas opções de download, com apenas uma diferença mínima: o compactador. Uma foi compactada utilizando ZIP e outra TAR/GZ. E ambas será necessário compilação, com os bons e velhos comandos: ./configure, make && make install.
Mas, chega de papo, vamos por a mão na "massa".
Instalando as dependências
As dependências para funcionamento do framework, não são muitas:
- WSO2 Web Services Framework for C
- PHP 5.1.1 ou superior
- Bibliotecas libxml2 e OpenSSL
WSO2 Web Services Framework for C
Para quem tá acostumado, são os velhos conhecidos, bastando baixar a última versão (no meu caso a 2.0.0):
wget http://dist.wso2.org/products/wsf/c/2.0.0/wso2-wsf-c-src-2.0.0.tar.gz tar xfvz wso2-wsf-c-src-2.0.0.tar.gz cd wso2-wsf-c-src-2.0.0 ./configure make sudo make install
PHP 5.1.1 ou superior
Não vou entrar nos méritos de instalação do PHP, pois imagino que isso esteja mais do que documentado na internet por aí a fora (para os preguiçosos - google: instalação do php no ubuntu).
Bibliotecas libxml2 e OpenSSL
O comando para instalar as dependências é:
sudo apt-get install libxml2 openssl
E com todas as dependências já instaladas e funcionando, podemos utilizar um phpinfo(); para conferir:
Compilação do WSF/PHP
CMM
E agora, a instalação propriamente dita, utilizando novamente os pacotes da versão 2.0.0:
wget http://dist.wso2.org/products/wsf/php/2.0.0/wso2-wsf-php-src-2.0.0.tar.gz ./configure make sudo make install
1, 2, 3, testando...
Estamos quase chegando lá...
Vamos copiar dois arquivos do diretório samples (um cliente e um servidor) para o diretório do servidor web (no meu caso: /var/www/samples) e ver se tudo funcionou:
sudo mkdir -p /var/www/samples/ sudo cp samples/math_* /var/www/samples/.
Indo ao navegador, basta abrir o endereço http://localhost/samples/math_client.php e conferir tudo funcionando:
Conclusão
Ainda não consigo avaliar até onde é válido ou interessante utilizar esse framework, não pesquisei a fundo ainda o funcionamento e as vantagens dele sobre as implementações como SOAP (nativa do PHP) NuSOAP.
Mas o fato de ser uma instalação que não pode ser feita em "qualquer" servidor, ainda mais no Brasil onde as empresas de hospedagens normalmente não instalam extensões de terceiros e o preço para ter um servidor próprio não é tão acessível, pode acabar ficando inviável.
Realizarei testes mais profundos para verificar as verdadeiras vantagens dessa abordagem na implementação dos serviços, só que - novamente - ficará para um outro post.
Consumindo um serviço seguro utilizando PHP
Dia desses precisei colocar autenticação em um serviço que desenvolvi e passeando pelas opções da interface administrativa da WSO2 Enterprise Service Bus encontrei facilmente minha solução. Um pouco depois, li no twitter do @WSO2 um comentário sobre um novo artigo publicado sobre segurança nos Data Services, onde ensinava a fazer toda a parte de configuração: Content Filtering in Data Services with User Roles.
Só que pouco tempo depois de configurar e entregar ao cliente o serviço, veio o problema: como consumir em PHP o serviço? No artigo a solução entregue por eles para consumo é em Java, como a capacidade do cliente deixa a desejar, fiquei de fazer e enviar um exemplo de consumo do serviço desenvolvido.
Então... mãos na massa!
Configurando a ESB
Nesse ponto não irei escrever passo-a-passo a configuração que deve ser feita, o trabalho realizado pelo pessoal do WSO2 está muito bem feito nessa parte do artigo: Step 4 – Enable User Authentication for the Data Service.
Consumo sem segurança
Um pequeno trecho de PHP que mostra como consumir o serviço sem nenhum tipo de segurança. Código pequeno, limpo e objetivo.
$client = new SoapClient("http://localhost:8280/services/Tutorial?wsdl");
try {
$obj = $client->searchProductsByGroupId(array("group_id" => 1));
print_r($obj);
} catch (Exception $e) {
echo "ERRO: " . $e->getMessage();
}
Mas mesmo com toda essa objetividade, o problema do cliente não estava resolvido e eu recebia o seguinte erro:
ERRO: SOAP header missing
E, para resolver, faltava adicionar o cabeçalho com os dados de segurança.
Consumo com segurança
Agora um não-tão-pequeno trecho em PHP.
// configurações de conexão
$username = "admin";
$password = "admin";
$created = date ("Y-m-d\TH:i:s", mktime (date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")))."Z";
// definição de namespaces
$ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$wsu = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
// criando elemento UsernameToken
$token = new stdClass;
$token->Username = new SOAPVar($username, XSD_STRING, null, null, null, $ns);
$token->Password = new SOAPVar($password, XSD_STRING, null, null, null, $ns);
// criando elemento Timestamp
$timestamp = new stdClass;
$timestamp->Created = new SOAPVar($created, XSD_STRING, null, null, null, $wsu);
// criando elemento Security
$wsec = new stdClass;
$wsec->UsernameToken = new SoapVar($token, SOAP_ENC_OBJECT, null, null, null, $ns);
$wsec->Timestamp = new SoapVar($timestamp, SOAP_ENC_OBJECT, null, null, null, $wsu);
// criando header
$headers = new SOAPHeader($ns, 'Security', $wsec);
// construtor do web-service (com cabeçalho) passando o endereço do WSDL
$client = new SoapClient("http://localhost:8280/services/Tutorial?wsdl");
$client->__setSOAPHeaders($headers);
// chamada do método
try {
$obj = $client->searchProductsByGroupId(array("group_id" => 1));
print_r($obj);
} catch (Exception $e) {
echo "ERRO: " . $e->getMessage();
}
E tudo rodou normalmente, sem problemas, o cliente ficou feliz e eu matei um pouco da saudade de programar em PHP.
Na pesquisa por soluções, tentei utilizar o WSO2 Web Services Framework for PHP mas descobri que depende de instalação de módulo no Apache e não servia para meu cliente, mas anotei na pauta para testá-lo em outro momento.

