Client JAX-WS de WebService .NET que usa Token de segurança (padrão WSE 3.0)

Prezados,

estou até envergonhado de dizer o que direi a seguir, mas realmente não consegui entender como funciona esse Token.

Pesquisei http://www.google.com.br/#sclient=psy&hl=pt-BR&site=&source=hp&q=cliente+jax-ws+usando+Token&oq=cliente+jax-ws+usando+Token&aq=f&aqi=&aql=&gs_sm=e&gs_upl=672252l695719l0l696495l67l58l14l16l16l1l5856l65569l4-3.9.0.4.0.11l28l0&bav=on.2,or.r_gc.r_pw.&fp=da1c7e7cdd4bcfdf&biw=1280&bih=638 e vi que tem algumas soluções, mas não estou conseguindo relmente entender.

Tenho que consumir um WebService que foi feito em .NET com o padrão WSE 3.0. Estamos usando o JAXWS para a geração desse client.

Usei o wsimport no WSDL que nos foi enviado. No documento da empresa, estava descrito que esse Token deveria ser inserido na classe de Proxy.

Ao Gerar pelo wsimport, não achei em nenhuma das classes onde inserir o maldito Token.

Pesquisando no livro [Java WebServices Implementando], ví que pode-se gerar um Handler que seta alguns parâmetros no Header, só que não ví como passar esses valores na hora de consultar o serviço.

No documento descreve que esse Token (usuário e senha) deve ser passado no proxy, mas no Proxy não há métodos nem atributos para que sejam setados esse Token, o Handler é comunicado sempre que chamamos o serviço e faz o trabalho implicitamente ???

Fiquei realmente boiando na questão. Estou em casa e assim que chegar posto as classes geradas.

Enquanto isso se alguém já passou pela questão e puder dar esse Help. Ficarei grato.

Abs[] e sucesso a todos.

Fala Cara…

Gere o cliente pelo NetBeans que ele irá pedir no wizard as informações do token em seguida ele irá gerar as classes.
Com as classes geradas vc consegue encontrar onde ele colocou o token.
O legal que o NetBeans gera o código todo usando o JAX-WS.

[quote=warley]Fala Cara…

Gere o cliente pelo NetBeans que ele irá pedir no wizard as informações do token em seguida ele irá gerar as classes.
Com as classes geradas vc consegue encontrar onde ele colocou o token.
O legal que o NetBeans gera o código todo usando o JAX-WS.

[/quote]

Fala Warley, muito obrigado pela atenção dispensada ao assunto.

Pois bem, fiz o teste no wsimport, no eclipse e no NetBeans e o curioso é que em nenhum essas informações foram pedidas. Meu NetBeans é o 6.9.1.

Devo gerar em alguma outra versão ?? Fiz alguma besteira ??

Um fato curioso é que me parece que essa informação do Token não se encontra no WSDL… Ela não deveria estar explícita nesse arquivo ???

Outro fato curioso é que em nenhum lugar eu vi essa informação ou então passei batido por ela, mas quando chamo o método do Serviço, a mensagem de que foi impossível obter o Token aparece como um SOAPFaultException.

Abs [] e mais uma vez, muito obrigado pela atenção dispensada.

Warley, mais uma vez agradeço.

O problema foi resolvido com essa solução aqui: http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client

O jeito foi criar um Handler + Resolver. Aí Voilá, tudo funcionou perfeitamente bem…

Agora tá dando erro interno, mas não é mais bronca do Token nem da comunicação.

Fica aí caso mais alguém precise.

Mais uma vez sou grato pela atenção dispensada.

Abs[] e sucessos a todos.

Prezado Adriano,

Estou passando pelo mesmo problema. Preciso consumir um Webservice em .NET, e estou criando uma aplicação Java para consumi-lo.
Consigo conexão, autenticar, recebo o Token de Autenticação, envio os valores para consulta, porém nesta consulta precisa-se inserir o Token e um IdUsuario no Header,
e é ai que a coisa complica. Sempre recebo uma mensagem de Falha na Autenticação, na classe de pesquisa não possui um método que recebe estes valores.

Dei uma olhada no link que você postou, porém não consegui entender muito, tentei implementar mas como não havia entendido direito to tendo muita dificuldade.
Poderia me dar um help sobre esta questão? Pode ser um explicativo sobre como usar o Header e Handler, ou um exemplo de implementação.

Desde já, grato.

Opa Vinícius, beleza. Cara, como você vê, essa solução é bem antiga e desde essa época que não olho mais pra código que precisa desse artefato.

Como não estou mais na empresa, não lembro ao certo exatamente o passo a passo pra resolver.

Faz o seguinte, me manda as tuas classes do cliente pra eu ver como estás implementando (se puderes é claro), que já dá pra agilizar um help, senão, quando chegar e,m casa hoje a noite, vou ver se movo meus contatos na antiga empresa pra ver se consigo pelo menos o trecho do código que implementou esse cliente…

Agora, se bem me lembro o Handler e o Resolver, são exatamente idênticos aos do link… Na última classe, que é a classe que te retorna o método da tua consulta, antes de pegar o ws.getPort() tens que fazer a inserção do resolver que criaste. Logo ele vai executar a consulta inserindo as informações de usuário e senha que colocaste na classe Handler…

Inclusive acho que pra fazer o teste, usei exatamente os mesmos nomes de classe que estão no exemplo, só não na classe do cliente.

PS: Lembre-se de alterar o usuário e senha na classe Handler…

PS2: Veja se o erro já não é do usuário e senha não existirem no BD do serviço.

se possível post aqui caso ocorra alguma Exception.

Aguardo seu retorno.

Abs []

Ola Adriano, muito obrigado pela pronta atenção.

Segue um trecho de como faço a autenticação:


        Autenticar autentica = new Autenticar();
        AutenticarResponse retornoToken = new AutenticarResponse();
        TokendeAutenticacao TokenPesq = new TokendeAutenticacao();
 
        autentica.setNomeUsuario("user");
        autentica.setSenha("123");
        String result = autenticar(autentica.getNomeUsuario(), autentica.getSenha());
        
        retornoToken.setAutenticarResult(result);
        
        
        TokenPesq.setInnerToken(retornoToken.getAutenticarResult());
        TokenPesq.setIdUsuario(0);

        System.out.println("Token de autenticação: "+TokenPesq.getInnerToken());

Desta forma conseguimos autenticar e exibir o token. Preciso pegar os valores InnerToken e IdUsuario e inseri-los no Header.
Implementei as duas classes conforme vc me indicou, mas preciso entender melhor como funcionam as classes HeaderHandler e HeaderHandlerResolver, pois não soube exatamente onde passar os valores (Token e IdUsuario).

Perdão por parecer tão juvenil, mas é porque sou iniciante nesta questão, meu nível é ainda acadêmico.
Fique a vontade para solicitar informações.

Muito obrigado.

Opa Vinicius sem problema…

Antes de tudo, como você falou que ainda é nível iniciante, eu pergunto:

  • Você já fez alguma vez algum Web Service? Entende os conceitos?

  • Qual das classes acima é o seu cliente do Web Service? Em que momento você conecta com a Interface do seu serviço?

Se você quiser, me envia um e-mail com seu projeto caso ele seja confidencial ou anexa ele aqui pra eu poder ver seu projeto…

Quanto ao fato de estar em nível acadêmico não se preocupe, quando comecei nesse mundo SOAP também não tive vida fácil não e as vezes pensava que nunca iria conseguir fazer funcionar. Há muito pouco material a nivel iniciante sobre o assunto, em português então é quase 0 e as vezes parecia que eu que era um verdadeiro incompetente, pois estava adentrando nesse mundo de WS e todo material que eu encontrava era mais um material de cabeceira para quem já manjava do assunto.

Ainda não sou dos mais experts de tanto trauma que tive, mas já aprendi a me desenrolar e depois de tanto tentar, você acaba aprendendo algo…

Abs []

Olha a propaganda:

http://www.casadocodigo.com.br/products/livro-soa-webservices

Quanto ao que você precisa, o código do livro fala sobre isso precisamente no capítulo 6. O código está aqui:

https://github.com/alesaudate/soa/tree/master/soa-cap06-estoque-cliente

[]'s

Alexandre, estava olhando o seu código e vi como você faz a segurança, com as chaves públicas, vc utiliza RSA, certo?
Eu tenho um ws em java que é acessado por um aplicativo desktop em c#, vai funcionar?
O seu livro ensina isto?
Na verdade eu quero aprender como criar o webservice e mantê-lo com o máximo de segurança possível, o seu livro ensina isto? Pode me dar um resumo?

Obrigado

Livro para aprender a lidar com Web Service SOAP em Java. Excelente livro. Ensina na prática usando as ferramentas de programação e com exemplos (servidor e cliente)
Nos livros de SOA examinei e tem mais teoria que prática. Vale a pena olhar este livro para quem está iniciando e quer aprender mais sobre o Web Service SOAP em Java:
http://novatec.com.br/livros/soapjava/