BlackTDN Search

domingo, 1 de agosto de 2010

Protheus :: Autenticação nos WebServices Protheus. Usando MD5 (Message Digest Algorithm 5)

Carlinha Soneta está fazendo com que eu seja produtivo na postagem de dicas para vocês. Dessa vez ela solicitou que, para a autenticação do usuário do WS, além de informar Usuário e Senha, fosse informado o "Hash" de uma mensagem. Essa solicitação baseou-se na necessidade de um cliente com .net e em função do seguinte artigo: "WebService utilizando soapHeader e token". Pensei um pouco e bolei o seguinte esquema para autenticação:

1 ) Criar um método para obtenção de Mensagens: O usuário do WS iria chamar esse método e obter uma mensagem aleatória. Retornaria o "Hash" dessa mensagem calculado via MD5;
2 ) Criar um método para validação do Usuário considerando, além do Usuário e Senha, o "Hash" da mensagem.

Eu poderia ter criado uma tabela de mensagens a serem geradas, mas optei em trabalhar com a tabela SX5 (Tabelas Genéricas) com a opção de retornar as mensagens em Português, Inglês ou Espanhol de forma aleatória e/ou embaralhada. Na realidade, o esperado do WS de mensagem é uma mensagem qualquer, que deverá ser codificada e retornada para autenticação do usuário do WS.

Sendo assim, criei os seguintes WS:

/*/
WSSERVICE: u_wsGetMessages
Autor: Marinaldo de Jesus & Carla (amor) Soneta
Data: 29/07/2010
Descrição: Serviço Mensagens Para Token de Autenticação de Usuário
Uso: WS
/*/

Esse WS será usado para a obtenção de Mensagens que serão utilizadas, em conjunto com Usuário e Senha, para a autenticação do usuário. Esse WS possui os seguintes métodos:

GetMessage: usado para a obtenção de Mensagem Aleatória ; e
ClearStackMD5Hash: usado para limpar a Pilha de Mensagens.

GetMessage receberá, como parâmetros: Language e Embaralha. Language será utilizado para identficar em que idioma a mensagem será enviada: PT (Português), ENG (Inglês), SPA (Spanish) ou Brancos (para não considerar a Descrição do SX5, retornando uma mensagem composta por constantes, e informações variáveis do sistema como Date() e Time()). Já Embaralha, do tipo lógico (boolean) quando "setado", fará com que as mensagens sejam "embaralhadas" antes de serem enviadas. Ele retornará conforme parâmetros de entrada, a mensagem ao "client" solicitante. O "Hash" dessa mensagem deverá ser retornado quando da validação do usuário do WS.

ClearStackMD5Hash receberá, como parâmetros de entrada: ClearAllMD5Hash, MD5HashClear e de saída Message. Se ClearAllMD5Hash for "setado" como "true" a pilha de mensagens armazenadas em GetMessage será esvaziada, caso contrário, apenas o "hash" passado em MD5HashClear será eliminado da pilha de mensagens. Message retornará uma mensagem informativa de acordo com o conteúdo de ClearAllMD5Hash.

/*/
WebService: u_wsUserValid
Autor: Marinaldo de Jesus & Carla Soneta
Data: 29/07/2010
Descrição: Web Service para Validação de Usuário do WS usando MD5
Uso: WebServices
/*/

Esse WS será utilizado para validar o Usuário e Senha e o "Hash" conforme mensagem obtida através do método GetMessage. Ele possui o seguinte método ValidUserWs.

O método ValidUserWs, receberá, como parâmetros de entrada: UserWs, UserWsPasswd, Token e HASHMD5UserAndPsw

UserWs : Nome e/ou Código do Usuário do WS
UserWsPasswd: Senha do Usuário do WS
Token: "MD5 Hash" da mensagem obtida através do WS u_wsGetMessages
HASHMD5UserAndPsw: Se, ao invés de Considerar o Usuário e Senha informados nos parâmetros, deverá considerar o "MD5 Hash" do valor digitado.

Esse método irá retornar lValidUserWs, com o valor "true", se o usuário for validado, ou "false" caso contrário. Um "Soap Fault" poderá ser gerado de acordo com o parâmetro invalidado.

Além do métodos acima, o programa que contém o WS de Validação de Usuário e obtenção das Mensagens, possui também a função Random( nRange , nMin , nMax ). Random retornará um numero aleatório para um determinado intervalo.

Considerando que o programa possui 2 WS, para cada um deverá ser gerado um "Client".

Além dos WS acima citados, foi criado o WS u_wsTstUserValid. Esse WS será utilizado para demonstrar o uso dos demais.

/*/
WebService: u_wsTstUserValid
Autor: Marinaldo de Jesus & Carla Soneta
Data: 29/07/2010
Descrição: Web Service para Teste Validação de Usuário do WS usando MD5
Uso: WebServices
/*/

O WS u_wsTstUserValid possui os seguintes métodos:

SampleVld01: "Exemplo 01 - Usando Language igual a PT, Usuário e Senhas originais e Não Embaralha"
SampleVld02: "Exemplo 02 - Usando Language igual a ENG, Usuário e Senhas originais e Não Embaralha"
SampleVld03: "Exemplo 03 - Usando Language igual a SPA, Usuário e Senhas originais e Não Embaralha"
SampleVld04: "Exemplo 04 - Usando Language em Branco, Usuário e Senhas originais e Não Embaralha"

SampleVld05: "Exemplo 05 - Usando Language igual a PT, Usuário e Senhas originais e Embaralha"
SampleVld06: "Exemplo 06 - Usando Language igual a ENG, Usuário e Senhas originais e Embaralha"
SampleVld07: "Exemplo 07 - Usando Language igual a SPA, Usuário e Senhas originais e Embaralha"
SampleVld08: "Exemplo 08 - Usando Language em Branco, Usuário e Senhas originais e Embaralha"

SampleVld09: "Exemplo 09 - Usando Language igual a PT, Hash de Usuário e Senha e Não Embaralha"
SampleVld10: "Exemplo 10 - Usando Language igual a ENG, Hash de Usuário e Senha e Não Embaralha"
SampleVld11: "Exemplo 11 - Usando Language igual a SPA,, Hash de Usuário e Senha e Não Embaralha"
SampleVld12: "Exemplo 12 - Usando Language em Branco, Hash de Usuário e Senha e Não Embaralha"

SampleVld13: "Exemplo 13 - Usando Language igual a PT, Hash de Usuário e Senha e Embaralha"
SampleVld14: "Exemplo 14 - Usando Language igual a ENG, Hash de Usuário e Senha e Embaralha"
SampleVld15: "Exemplo 15 - Usando Language igual a SPA,, Hash de Usuário e Senha e Embaralha"
SampleVld16: "Exemplo 16 - Usando Language em Branco, Hash de Usuário e Senha e Embaralha"

E todos eles receberão, como parâmetro de entrada: Usr e Pwd, retornando: lUserOk. Cada um explorará as características de validação de maneira diferente (no exemplo, 16). Considerando que no WS de validação defini as seguintes constantes como Usuário e Senha:

#DEFINE USERWS_NAME, com o seguinte valor: 'naldodj'

e ;

#DEFINE USERWS_PASSWORD, com o seguinte valor:

'@#Essa[!$]Eh[!$]A[!$]Minha[!$]Senha[!$]Para[!$]Acesso[!$]Ao[!$]Ws#@'

São essa informações que deverão ser passadas para validação. Altere-as conforme o seu gosto e necessidade.

Dessa vez não vou reproduzir o código aqui no "post". Disponibilizarei apenas o link para os arquivos ( num total de 5 ).

Esses arquivos são:

1 ) u_WsUserValid.prw: contém os WS para obtenção das mensagens e para Validação;
2 ) client_u_wsGetMessages.prw: Client do WS u_wsGetMessages;
3 ) client_u_wsUserValid.prw: Client do WS u_wsUserValid;
4 ) u_WsTstUserVld.prx: contém o WS com exemplos de uso; e
5 ) client_U_WSTSTUSERVALID.prw: Client do WS u_wsTstUserValid.

Para usá-los:

1 ) Compile o programa u_WsUserValid.prw;
2 ) Compile o programa u_WsTstUserVld.prx; e
3 ) Gere os clientes para cada serviço.

Bom divertimento. E, como sempre, clique aqui para "baixar" os fontes.

[]s
иαldσ dj


...

Nenhum comentário:

Postar um comentário