No decorrer do desenvolvimento de um projeto da Mobiltec, tivemos a necessidade de implementar uma ferramenta de comunicação instantânea entre os usuários do sistema. Como características principais, esta ferramenta devia ser integrada ao sistema e compatível com as suas diversas interfaces (web e mobile).
Quando falamos em comunicação instantânea na internet, nos vem a cabeça ferramentas como MSN Messenger, Skype, ICQ (para os mais antigos), entre outras. Estes são tipicamente aplicativos desktop. No entanto nossa implementação precisa ser suportada por uma aplicação web.
Hoje temos vários sites que já funcionam como comunicadores instantâneos, sem que o usuário precise abrir um novo aplicativo e fazer o login, dispensando a troca de tela sempre que uma pessoa se comunica consigo. Exemplos clássicos são o Hotmail.com (que implementou dentro do serviço de webmail a funcionalidade de conversação com seus contatos do MSN) e o Facebook.
A proposta desta postagem é apresentar as ferramentas e técnicas envolvidas na construção do sistema de chat do nosso projeto.
Openfire
Voltando a necessidade da empresa, pesquisando na internet achamos a referencia ao protocolo XMPP (Extensible Messaging and Presence Protocol), que é uma alternativa a protocolos proprietários de aplicações como o MSN Messenger. O ponto chave do protocolo é o princípio de gateways, que possibilitam a comunicação de uma rede XMPP com outras redes que usam diferentes protocolos. Dessa forma, é possível que uma aplicação XMPP se comunique com contas de outros serviços, como MSN, ICQ, etc…
Parte da nossa solução de implementação no projeto foi utilizar como servidor de mensagens instantâneas o aplicativo OPENFIRE, que é um Real Time Collaboration (RTC) Server. A comunicação com este servidor usa somente o protocolo XMPP para troca de mensagens. O processo de instalação é super simples.
Dica: Para que o OPENFIRE possa inicializar junto com o Windows, utilize a linha de comando, navegue até o diretório ‘C:\Program Files\Openfire\bin’ (diretório bin da instalação do OpenFire) e execute o comando “openfire-service /install”
Obs.: Esse método de criação do serviço do Openfire não funciona em win7 e win2008. Para isso deve ser importado para o registro do sistema o arquivo disponibilizado pelo link a seguir e seguido as instruções propostas pelo pequeno tutorial descrito no mesmo: http://bit.ly/HGq0sH
Configurações extras para o HTTP Binding
-> Ao abrir o painel de configuração do openfire <server>:<porta, default:9090> adicionar as seguintes chaves em Server -> Server Manager -> System Properties
- httpbind.enabled = false
- xmpp.httpbind.client.requests.polling = 0
- xmpp.httpbind.scriptSyntax.enabled = false
- xmpp.session.conflict-limit =0
- xmpp.socket.ssl.active = true
- xmpp.auth.anonymous = false
-> Adicionaremos as seguintes duas linhas abaixo para ajudar na realização do update do vínculo das amizades entre a base de dados e o WebAdmin do Openfire:
- cache.username2roster.size = 0
- cache.username2roster.maxLifetime = 0
-> As chaves supracitadas são necessárias para o correto funcionamento do chat.
Bosh Server
No decorrer da etapa de pesquisa, nos deparamos com vários problemas em relação ao tempo de conclusão da funcionalidade. A principal delas se refere ao ambiente de execução, rodando IIS 6+ e o componente ASP.NET, pois não foi fácil obter informações sobre como implementar uma ferramenta de chat web nesta plataforma.
Foi utilizado o conceito de HTTP Binding (BOSH SERVER) para nossa solução, que é um Connection Manager, atuando junto de um servidor XMPP. Este proporciona ao usuário um método para manter uma conexão ativa com o Openfire via HTTP. Após muita análise e testes realizados com algumas soluções, para o nosso cenário a mais adequada encontrada foi o Bosh Server “Punjab”, recomendada por diversos blogs como solução mais estável para o serviço de conexão Bosh.
Mas como nem tudo são rosas, tivemos alguns problemas iniciais para fazer com que a solução executasse de forma plena. O processo de instalação e configuração demandou configurações prévias à sua instalação:
- Python 2.5 >
- Recomendado usar as versões 2.x encontradas em http://bit.ly/Hbj7jN
- Twisted 11.0.0 >
- No link http://twistedmatrix.com/ é encontrado a versão 11+ específica para a versão do Python à ser utilizada
- pyOpenSSL
- setuptools 0.6c11
- zope.interface 3.7.0
Dica: Para instalar este último, navegue pela linha de comando até o diretório onde está localizado o arquivo ‘zope.interface 3.7.0’ e execute a seguinte linha para instalar este modulo do pack Zope:
- ‘easy_install zope.interface-3.7.0-pyXX-win32.egg’
Obs. 1: É provável que ao executar os scripts Python e Twisted (setuptools também) acuse um erro de que não sejam reconhecidos pelo DOS, sendo necessário configurá-los na variável PATH do Windows com o caminho de seus executáveis, como por exemplo:
- C:\Python27\ (Python)
- C:\Python27\scripts (Twisted)
Obs. 2: Recomendado usá-las como uma var isolada denominada “PYTHON” e adicionar apenas “%PYTHON%” ao final da string do Path
Feito estas configurações, partimos para a instalação do Punjab:
-> Baixe a última versão pelo link http://github.com/twonds/punjab
-> Descompacte o arquivo .tar.gz no diretório onde deseja configurá-lo e renomeie-o para “Punjab”
-> Pela linha de comando, execute o script de instalação no diretório onde foi recém descomprimido e renomeado:
-> Após realizar o processo de instalação, algumas configurações devem ser feitas para que possamos realizar a execução do connection manager com sucesso. Localize o arquivo punjab.tac no diretório ‘Punjab’ e abra ele com o editor de texto, edite as seguintes linhas:
- Assegure-se que a chamada ‘root.putChild’ esteja passando o primeiro valor como ‘http-bind’
- Em internet.TCPServer a porta a ser usada por nosso Bosh será 7070
Obs.: O padrão usado no projeto Punjab é a 5280, porém nós utilizamos a 7070 devido ao javascript ter sido desenvolvido com ela, em razão das soluções testadas anteriormente (próprio Openfire) que a utilizam como padrão para estabelecer uma conexão Http Binding
- Abaixo da linha ‘bosh = HttpbService(1)’, adicionar uma nova com a informação “bosh.connect_srv = False”. Isso impedirá que nosso Bosh Service tenha problemas na resolução de nomes (caso não utilize uma zona DNS durante os testes)
-> Feito isso, podemos executar a seguinte instrução para que o Punjab seja iniciado:
Obs.: Para testar seu funcionamento, basta acessar http://localhost:7070/http-bind. Uma página de teste do próprio Punjab deverá ser exibida, contendo o seguinte conteúdo:
A etapa de comunicação da parte do servidor está concluída. A etapa seguinte é referente a aplicação web, que vai se comunicar com o connector manager (Bosh), no qual irá tratar as requisições recebidas e se comunicar com o XMPP server (Openfire).
Vendo que muitas das idéias que analizamos utilizam Apache e PHP ou JSP (entre outras open source), nossas possibilidades foram diminuindo, até que com muita pesquisa encontramos uma biblioteca Javascript que contemplava nossa necessidade, mas homologar este ambiente para que evitasse problemas de CORS (Cross-Origin Resource Sharing) demandou um tempo maior de análise do cenário atual que nos encontravamos.
JSJaC
-> Biblioteca Javascript client para jabber/XMPP
-> Suporta HTTP Polling e BOSH
- HTTP Polling
- É uma extensão do protocolo XMPP que permite o acesso a um servidor Jabber por trás de firewalls que não permitem sockets de saída na porta 5222, através de solicitações HTTP.
- BOSH
- É um protocolo de transporte que emula a semântica de uma conexão TCP com “vida longa”, bidirecional entre duas entidades (como um client e um server) de forma eficiente usando vários pares de HTTP requests / responses síncronas, sem a necessidade do uso de polling frequente ou em blocos de respostas.
-> Comunicação feita através de XMLHttpRequest (XHR)
JAPIX
-> Utiliza o jsjac com algumas modificações
-> Rede social focada em comunicação, com um chat completo e com muitas funcionalidades, dentre elas o Jappix Mini
-> Para nossa solução, apenas o Jappix Mini foi aproveitado
-> Muitas melhorias foram implementadas e alguns bugs corrigidos para se adaptar as nossas necessidades
-> Sofreu algumas alterações na forma nativa de funcionamento e aplicamos algumas políticas de uso
INTEGRAÇÃO COM ASP.NET
Principais pontos de integração do aplicativo ASP.NET :
Login
O Login é feito buscando o id do usuário e unindo ao server descrito no web.config do projeto na seguinte forma: <id>@<server>.
Salvando informações do usuário
Para salvar as informações do usuário de forma segura, usa-se a Sessão do usuário e para persistir esses dados, SecureCookie.
Logout
Desconecta do Openfire, limpa a sessão e apaga dados salvos nos cookies. As operações que se referem à sessão e cookies são executadas por um WebService. Quanto a desconectar, é feito por um javascript. O comportamento original de LogOut era função da página Logout.aspx do nosso projeto, agora essa página apenas limpa a variável de sessão que indica a necessidade de chamar o WebService referenciado.
Enviando ao Client
Uma das vulnerabilidades do jappix minichat é a necessidade de ter o nome do usuário e senha no javascript para conectar, ou seja, se abrir o javascript de uma página com o chat da maneira originalmente proposta, encontra-se Connect(<usuário>,<senha>), um texto sem nenhum tipo de proteção.
Como solução utiliza-se HTTPS para obter as informações se usuário e senha via javascript, através de JSONP.
Secure Cookie
Classe acrescentada ao projeto, como parte da sua lógica de negócio. Contém um Singleton para um objeto Encrypter e faz a busca e inserção de informações em cookies de forma segura. Aplica a criptografia Blowfish para proteger os dados salvos em Cookie (biblioteca de encriptação usada em C#).
JSONP
- Extensão de Json
- Escolhida especialmente para usar com HTTPs
- Faz uma chamada remota para o serviço SecureRetrieveUserInfo.asmx
- Para a requisição ao serviço seja processada corretamente no ambiente .Net, faz-se necessário a inclusão de ContentTypeHttpModule como httpModules, inserindo a seguinte linha na seção <httpModules> do web.config do Portal
<add name="ContentTypeHttpModule" type="ContentTypeHttpModule.ContentTypeHttpModule, ContentTypeHttpModule" />
IIS 6.0
Para que o IIS possa ler e interpretar requisições de ProxyRequest (configuração nativa do Apache), instalamos o módulo IONIC ISAPI REWRITE FILTER (IIRF):
-> Permite operações comuns de servidores como Apache e soluciona o problema de Cross Domain
-> Encontrado em http://iirf.codeplex.com/releases/view/70382 para download de sua versão mais atual e estável
-> Após concluir o download, execute o arquivo de instalação e basta seguir os passos até concluir o processo
-> Para maiores dúvidas quanto ao processo de instalação (manual ou automático), pode ser acessado http://bit.ly/H5Yj9u
Obs.: Durante a instalação, deve-se atentar ao passo de escolha do virtual host no qual deseja aplicar a solução
Arquivo de configuração
-> Adicionar em C:\Inetpub\wwwroot um arquivo chamado “Iirf.ini” com as seguintes linhas:
- ProxyRequests On
- ProxyPass /http-bind http://<server>:<bosh port>/http-bind
- ProxyPassReverse /http-bind http://<server>:<bosh port>/http-bind
Obs.: Onde <server> é o nome do servidor e <bosh port> é a porta configurada no Openfire
Habilitar extensão iirf
-> No IIS, vá em ‘Web Sites’, clique com o botão direito no Default Web Site onde está configurado o ambiente de desenvolvimento do chat e em seguida clique em ‘propriedades’
-> Na guia ‘Home Directory’ clique em ‘Configuration’ e em seguida no botão “Add…” na aba ‘Mapping’ da nova janela aberta
-> Na caixa de dialogo aberta, defina os seguintes valores para os itens abaixo:
- Executable = “”C:\Program Files\Ionic Shade\IIRF 2.1\IIRF.dll””
- Extension = “.iirf”
- Verbs = All Verbs
- Check ‘Script engine’
- Uncheck ‘Verify that file exists’
-> Após adicionar esta nova ‘Extension’, volte para propriedades e vá na aba ‘Directory Security’ e certifique-se que o acesso anônimo está setado para este web site (e todos seus virtual directories)
INTERNET INFORMATION SERVICES (IIS) 6.0 RESOURCE KIT TOOLS
-> Habilita o certificado de segurança para o acesso HTTPS ao portal
-> Proporciona a troca de informações do usuário entre o servidor e o JavaScript de uma forma segura
recursos
-> Para a instalação, baixe o instalador do aplicativo IIS 6.0 Resource Kit Tools pelo link http://bit.ly/H5YP7B
-> Após a instalação, vá em Iniciar > Programas > IIS Resources > SelfSSL e execute o aplicativo “SelfSSL”
-> Na tela do command aberta, digite “SelfSSL” para executar o programa
-> Digite “y” para confirmar a instalação do certificado
Web.Config – NOVAS CHAVES E SUA UTILIDADE
<add key=" AllowOpenfireIntegration" value="True" />
è Ativa a integração do portal com o openfire e chat
<add key="JabberServer" value="servidor"/>
-> Indica o nome do server onde se encontra o openfire. Obs: não pode ser “localhost”
<add key="JabberServerInLocalMachine" value="False"/>
-> Quando essa chave é true, quer dizer que o chat está executando em uma máquina local ou com um IIS de versão 5.0 ou inferior, ou seja, que não possua as features de ProxyPass e ProxyPassReverse
<add key="UserInfoService" value="https://servidor/nopcommercestore/Extensions/SecureRetrieveUserInfo.asmx/UserName"/>
-> Endereço do serviço para recuperar as informações do usuário via JavaScript
<add key="DeleteUserInfoService" value="http://servidor/nopcommercestore /Extensions/SecureRetrieveUserInfo.asmx/DeleteUserInfo"/>
-> Endereço do serviço que faz o logout do usuário e limpa os dados de sessão e cookies salvos
O objetivo neste post é trazer uma ideia inicial de como fazer a integração em um ambiente windows com uma página simples em ASP.NET, com recursos de um chat web. Inicialmente encontramos dificuldades para a implementação devido ao pouco material documentado para a integração com este ambiente. Motivo que também nos impossibilitou de testar um número maior de alternativas, mas com os recursos encontrados já é possível tirar muito proveito de suas funcionalidades.
Escrito por Gregory Miola Silva