» Início » Programação » Delphi » Integração de Sistemas em PHP e Delphi usando WebServices
 
Avaliação: | Publicado em: 29/04/2007
Integração de Sistemas em PHP e Delphi usando WebServices


Todos nós sabemos que um WebService é disponibilizado na Web e por isso, qualquer pessoa pode usar um WSDL Importer da vida e sair fazendo chamadas do seu serviço.

Como não é isso que queremos nesse caso, precisamos implementar algum tipo de autenticação. A primeira idéia era usar autenticação HTTP. Mas antes de implementar algo em PHP, resolvi testar os componentes em Delphi para ver se é possível fazer isso. Achei um artigo que pareceu funcionar, mas não fez diferença alguma.

A segunda opção era implementar um método login que retorna um ticket usando uma idéia parecida com sistemas de Single Sing On. Na primeira chamada, o cliente chama um método login passando usuário e senha e recebe um ticket que será passado como parâmetro nas próximas chamadas.

Desta forma, o método login deve ser definido e registrado conforme o código abaixo:

<?php

function login($usuario, $senha) {

  if ($usuario == "service" && $senha == "secret") {
    $ticket = md5(uniqid());

    session_name($ticket);

    session_start();

    $_SESSION["login"] = true;

    return $ticket;
  } else {

    return "401: Usuário ou senha inválidos";
  }

}

// Registra o método login

$server->register("login",

  array("usuario" => "xsd:string",

        "senha" => "xsd:string"),

  array("return" => "xsd:string"),

  "urn:SolicitacaoService",

  "login",

  "rpc",

  "encoded");
?>

O ticket é gerado usando a função uniqid, que garante a geração de um identificador único, e aplicando um hash MD5 ao “id” gerado. Esse ticket é armazenado em uma variável da sessão.

Um detalhe importante da implementação da função login é usar a função session_name($ticket) para nomear a sessão com o ticket gerado. Desta forma não existe risco de falhas de segurança, pois cada ticket gerado cria uma nova sessão.

Para terminar, a função abaixo valida se o ticket passado por parâmetro é válido:

<?php

function checkLogin($ticket) {

  session_name($ticket);

  session_start();

  return isset($_SESSION["login"]);
}
?>

 

A implementação da função gravar terá sua assinatura alterada para receber o ticket como parâmetro e validá-lo, conforme o código abaixo:

<?php

function gravar($arrAttr) {
  if (!checkLogin($ticket)) {
     return "401: Autenticação não encontrada";

  }

  return "ACK";

}

 

// Registra o método gravar

$server->register("gravar",

  array("ticket" => "xsd:string",

        "arrAttr" => "tns:ArrayOfstring"),

  array("return" => "xsd:string"),

  "urn:SolicitacaoService",

  "gravar",

  "rpc",

  "encoded");

?>

 

No cliente, novamente devemos usar o WSDL Importer para gerar a unit do serviço e alterar o código para chamar primeiro o método login, conforme o código abaixo:

procedure TForm1.btnLoginClick(Sender: TObject);

var arr : ArrayOfstring;
    ticket: string;

begin

  solicitacaoService := GetSolicitacaoServicePortType();
  ticket := solicitacaoService.login('service', 'secret');

  // Definição do array com os parâmetros...

  ShowMessage(solicitacaoService.gravar(ticket, arr));

end;


Carlos R. Laurindo <crlau@acervonet.com.br>
Muito interessante. Preciso trocar informações sobre um projeto de integração para uma futura licitação, se tiveres interesse me rersponda.
Olá, gostaria de saber com fazer o webservice em Delphi e consumir um Dataset em php, se puder me ajudar t agradeço.
olha Sr. Saulo, aqui é o Augusto Salgado, sou diretor e Superintendente sa empresa Selo, Softwares e laboratorio, o artigo que descreveu não está muito claro, acho que você deixou algo a desejar, o servidor de soap, não tá funcionando direito, apache é no linux e eu to no windows, porem achei que era algo de um indio. Você é indio? Ruby on Rails, rubi ligado com raio de sol, que coisa, vai estudar mais, e para de beber, voce está chapado ou está fumando maconha, bom isso eu sei que faz...
Salgado...
foi muito bom esse te manual de procedimento para fazer o web
Evandro.Net
Muito interessante! <a href="http://evandro.net/"></a>http://evandro.net/ : Não avaliado