V
victor-zamora
Expondo aplicações HTTP durante desenvolvimento
O que são túneis?
A Internet é uma rede de computadores de alcance mundial, pelo menos quando vista de um ponto de vista mais lógico do que físico. Fisicamente a Internet é uma rede de redes interligadas por quilômetros de cabos variados, ondas de rádio, ondas de luz e milhões de dispositivos.
Estas redes têm como principal idioma um conjunto de protocolos conhecido como TCP/IP e, sem entrar em muitos detalhes, uma das principais características desse conjunto de protocolos é a capacidade de direcionar o caminho dos pacotes de dados entre redes. Esse papel é feito por roteadores que são dispositivos que conectam redes diferentes e direcionam os pacotes que entram ou saem das redes conectadas.
Além de roteadores as redes costumam também implementar soluções para ampliar o nível de segurança, como por exemplo os firewalls que bloqueiam a comunicação vinda de fora de uma rede e também os proxies que fazem com que toda a comunicação saia de uma rede através de um único ponto onde podem ser aplicadas validações de dados e endereços acessados.
É grande a chance de que o computador que o programador está usando para escrever código estará conectado a uma rede local que por sua vez estará conectada à Internet através de um roteador e protegida por um firewall na entrada e um proxy na saída, mesmo em uma rede doméstica o software no roteador desempenha estes papeis.
Este cenário impede que as aplicações que estamos desenvolvendo sejam acessadas externamente pois apenas a comunicação iniciada de dentro da rede local terá acesso à Internet.
Um túnel é uma forma de transmitir dados de forma privada através de redes públicas, algumas implementações comuns desse conceito são Virtual Private Networks (VPNs) e Secure Shell (SSH).
Por que precisamos de túneis?
Túneis facilitam a nossa vida quando temos a necessidade de desenvolver integrações com serviços externos que implementem interfaces baseadas em eventos.
O tratamento destes eventos é comumente feito através de um mecanismo conhecido como webhook que nada mais é do que expor uma interface REST que será chamada pelo serviço externo sempre que eventos nos quais tenhamos interesse ocorram. Webhooks são uma forma de se implementar arquiteturas do tipo publicadores e assinantes em aplicações Web.
Para testar e depurar um webhook é necessário expor a aplicação para a Internet e isto, via de regra, não é possível a partir de uma máquina de desenvolvimento sendo necessário publicar a aplicação para testar e depurar remotamente o que acaba tornando o processo de desenvolvimento mais moroso.
Através de um túnel é possível executar uma aplicação localmente e expor um endpoint público que pode ser usado para receber requisições HTTP vindas do serviço com o qual se deseja integrar.
Visual Studio Dev Tunnels
O Visual Studio 2022 oferece o serviço Dev Tunnels que permite abrir um túnel ao iniciar as aplicações na IDE, esta funcionalidade faz parte do workload ASP.NET e web development.
A conexão é aberta a partir da máquina local para servidores na Internet cujo papel é receber mensagens através de um endpoint (identificado por uma URL) e repassar essas mensagens para o computador em que estamos escrevendo e depurando o nosso código.
Para experimentar essa funcionalidade, crie uma aplicação Web ou uma Web API usando o template ASP.NET Core Web App no Visual Studio 2022 (versão 17.6 ou posterior).
A funcionalidade é acessada através do menu de opções de depuração no Visual Studio:
Menu de depuração do Visual Studio mostrando a opção Dev Tunnels
Neste menu é possível criar tuneis ou selecionar tuneis existentes que serão ativados ao executar a aplicação a partir do Visual Studio.
Selecione a opção Create a Tunnel… e a seguinte janela será exibida:
Janela de criação de túnel
Nessa janela temos as seguintes opções:
Para testar a aplicação usando um túnel primeiro certifique-se de que o túnel está ativo no menu de opções de depuração:
Menu de opções indicando que o túnel Dev Tunnels Demo está ativo (check mark)
Inicie a aplicação em debug no Visual Studio e note que a aplicação será executada no browser utilizando uma URL externa com nome aleatório ao invés de localhost, por exemplo https://bvqlqp92-7035.brs.devtunnels.ms. É interessante notar que a porta local é acrescentada ao nome aleatório.
Ao acessar pela primeira vez, um aviso de que a aplicação está sendo acessada através de um túnel será exibido e é necessário escolher Continue para acessar a aplicação:
Aviso de acesso a aplicação através de túnel, com recomendações para seguir em frente apenas se o usuário confia na URL e os botões de continuar ou reportar possível fraude
Após a confirmação a aplicação é acessada no browser, porém as chamadas são feitas a partir da Internet e redirecionadas para a máquina de desenvolvimento através do túnel.
Experimente acessar a aplicação a partir de outro computador, tablet ou celular usando a URL do túnel e veja como ela poderá ser acessada normalmente. Se o acesso ao túnel for definido com qualquer opção diferente de Public a autenticação será exigida.
Uma forma rápida de acessar a aplicação usando um celular ou tablet é utilizar o botão para gerar um código QR na barra de endereços do Microsoft Edge:
Botão de geração de código QR na barra de endereços do MS Edge e código QR com a URL do Dev Tunnel
Na janela Output do Visual Studio é possível verificar as mensagens informativas e de erros do Dev Tunnels:
Janela Output do Visual Studio mostrando as URLs configuradas para o túnel
Além do menu de depuração é possível gerenciar os tuneis a partir da janela Dev Tunnels que pode ser aberta através da opção Show Dev Tunnels Window no menu de depuração ou através do menu View -> Other Windows -> Dev Tunnels:
Janela Dev Tunnels no Visual Studio
Nessa janela é possível ativar/desativar túneis, alterar configurações de portas, criar e remover túneis.
Também é possível copiar um token de acesso ao túnel, clicando com o botão direito, que pode ser usado em situações em que se deseja depurar APIs onde não é possível efetuar logon interativo através de um túnel criado com acesso privado ou corporativo.
O token deve ser passado através do cabeçalho X-Tunnel-Authorization tunnel <TOKEN>, se o cabeçalho não for informado o acesso será bloqueado:
Menu de contexto destacando a opção Copy Tunnel Access Token
Outras opções
Dev Tunnels no Visual Studio oferecem uma alternativa simples e eficiente para cenários onde é necessário depurar aplicações em que os endpoints devam obrigatoriamente ser acessíveis a partir da Internet, como é o caso de aplicações que expõem webhooks, sem que sejam necessárias configurações na infraestrutura de rede.
Existem outras soluções como é o caso do NGROK que é um serviço que também permite criar túneis e expor aplicações através desses túneis. O NGROK possui um nível gratuito de serviço, que tem funcionalidades equivalentes às oferecidas pelo Visual Studio, e também níveis pagos que agregam outras funcionalidades, como por exemplo domínios personalizados.
Outra opção que pode ser utilizada é publicar a aplicação em um Azure App Service configurado para depuração remota, nesse caso é possível anexar o processo em execução no App Service e depurar remotamente com o Visual Studio, o inconveniente desse modelo é a latência entre a máquina do desenvolvedor e a aplicação remota que torna o processo um pouco mais pesado.
Conclusões
Dev Tunnels facilitam a vida do desenvolvedor em cenários onde é necessário expor a aplicação externamente como é o caso do desenvolvimento de webhooks, mas não só, servem também para testar aplicações Web em múltiplos dispositivos ou para disponibilizar uma aplicação temporariamente para demonstrações ou avaliações.
Em um próximo artigo vamos explorar o uso de Dev Tunnels para depuração de chamadas feitas a partir de serviços externos.
Referências
Continue reading...
O que são túneis?
A Internet é uma rede de computadores de alcance mundial, pelo menos quando vista de um ponto de vista mais lógico do que físico. Fisicamente a Internet é uma rede de redes interligadas por quilômetros de cabos variados, ondas de rádio, ondas de luz e milhões de dispositivos.
Estas redes têm como principal idioma um conjunto de protocolos conhecido como TCP/IP e, sem entrar em muitos detalhes, uma das principais características desse conjunto de protocolos é a capacidade de direcionar o caminho dos pacotes de dados entre redes. Esse papel é feito por roteadores que são dispositivos que conectam redes diferentes e direcionam os pacotes que entram ou saem das redes conectadas.
Além de roteadores as redes costumam também implementar soluções para ampliar o nível de segurança, como por exemplo os firewalls que bloqueiam a comunicação vinda de fora de uma rede e também os proxies que fazem com que toda a comunicação saia de uma rede através de um único ponto onde podem ser aplicadas validações de dados e endereços acessados.
É grande a chance de que o computador que o programador está usando para escrever código estará conectado a uma rede local que por sua vez estará conectada à Internet através de um roteador e protegida por um firewall na entrada e um proxy na saída, mesmo em uma rede doméstica o software no roteador desempenha estes papeis.
Este cenário impede que as aplicações que estamos desenvolvendo sejam acessadas externamente pois apenas a comunicação iniciada de dentro da rede local terá acesso à Internet.
Um túnel é uma forma de transmitir dados de forma privada através de redes públicas, algumas implementações comuns desse conceito são Virtual Private Networks (VPNs) e Secure Shell (SSH).
Por que precisamos de túneis?
Túneis facilitam a nossa vida quando temos a necessidade de desenvolver integrações com serviços externos que implementem interfaces baseadas em eventos.
O tratamento destes eventos é comumente feito através de um mecanismo conhecido como webhook que nada mais é do que expor uma interface REST que será chamada pelo serviço externo sempre que eventos nos quais tenhamos interesse ocorram. Webhooks são uma forma de se implementar arquiteturas do tipo publicadores e assinantes em aplicações Web.
Para testar e depurar um webhook é necessário expor a aplicação para a Internet e isto, via de regra, não é possível a partir de uma máquina de desenvolvimento sendo necessário publicar a aplicação para testar e depurar remotamente o que acaba tornando o processo de desenvolvimento mais moroso.
Através de um túnel é possível executar uma aplicação localmente e expor um endpoint público que pode ser usado para receber requisições HTTP vindas do serviço com o qual se deseja integrar.
Visual Studio Dev Tunnels
O Visual Studio 2022 oferece o serviço Dev Tunnels que permite abrir um túnel ao iniciar as aplicações na IDE, esta funcionalidade faz parte do workload ASP.NET e web development.
A conexão é aberta a partir da máquina local para servidores na Internet cujo papel é receber mensagens através de um endpoint (identificado por uma URL) e repassar essas mensagens para o computador em que estamos escrevendo e depurando o nosso código.
Para experimentar essa funcionalidade, crie uma aplicação Web ou uma Web API usando o template ASP.NET Core Web App no Visual Studio 2022 (versão 17.6 ou posterior).
A funcionalidade é acessada através do menu de opções de depuração no Visual Studio:
Menu de depuração do Visual Studio mostrando a opção Dev Tunnels
Neste menu é possível criar tuneis ou selecionar tuneis existentes que serão ativados ao executar a aplicação a partir do Visual Studio.
Selecione a opção Create a Tunnel… e a seguinte janela será exibida:
Janela de criação de túnel
Nessa janela temos as seguintes opções:
Account: o acesso ao serviço ao Dev Tunnels é feito de forma autenticada e podem ser utilizadas contas do Azure, Contas Microsoft ou GitHub.
Name: nome do túnel, esse nome é utilizado para identificação na interface com usuário do Visual Studio.
Tunnel Type (Temporary/Permanent): essa configuração determina o tempo de vida da URL do túnel, túneis temporários recebem uma nova URL toda vez que o Visual Studio é iniciado enquanto túneis permanentes mantém a mesma URL entre sessões do Visual Studio.
Access: determina o tipo de autenticação necessária para acessar a aplicação através do túnel, sendo:
Private: somente pela conta que criou o túnel.
Organization: contas dentro da mesma organização de quem criou o túnel. No caso de Contas Microsoft o efeito é o mesmo que selecionar Private e contas organizacionais do GitHub não são suportadas.
Public: nenhuma autenticação necessária. Utilizar apenas se não houver risco em disponibilizar a aplicação para qualquer pessoa na Internet.
Para testar a aplicação usando um túnel primeiro certifique-se de que o túnel está ativo no menu de opções de depuração:
Menu de opções indicando que o túnel Dev Tunnels Demo está ativo (check mark)
Inicie a aplicação em debug no Visual Studio e note que a aplicação será executada no browser utilizando uma URL externa com nome aleatório ao invés de localhost, por exemplo https://bvqlqp92-7035.brs.devtunnels.ms. É interessante notar que a porta local é acrescentada ao nome aleatório.
Ao acessar pela primeira vez, um aviso de que a aplicação está sendo acessada através de um túnel será exibido e é necessário escolher Continue para acessar a aplicação:
Aviso de acesso a aplicação através de túnel, com recomendações para seguir em frente apenas se o usuário confia na URL e os botões de continuar ou reportar possível fraude
Após a confirmação a aplicação é acessada no browser, porém as chamadas são feitas a partir da Internet e redirecionadas para a máquina de desenvolvimento através do túnel.
Experimente acessar a aplicação a partir de outro computador, tablet ou celular usando a URL do túnel e veja como ela poderá ser acessada normalmente. Se o acesso ao túnel for definido com qualquer opção diferente de Public a autenticação será exigida.
Uma forma rápida de acessar a aplicação usando um celular ou tablet é utilizar o botão para gerar um código QR na barra de endereços do Microsoft Edge:
Botão de geração de código QR na barra de endereços do MS Edge e código QR com a URL do Dev Tunnel
Na janela Output do Visual Studio é possível verificar as mensagens informativas e de erros do Dev Tunnels:
Janela Output do Visual Studio mostrando as URLs configuradas para o túnel
Além do menu de depuração é possível gerenciar os tuneis a partir da janela Dev Tunnels que pode ser aberta através da opção Show Dev Tunnels Window no menu de depuração ou através do menu View -> Other Windows -> Dev Tunnels:
Janela Dev Tunnels no Visual Studio
Nessa janela é possível ativar/desativar túneis, alterar configurações de portas, criar e remover túneis.
Também é possível copiar um token de acesso ao túnel, clicando com o botão direito, que pode ser usado em situações em que se deseja depurar APIs onde não é possível efetuar logon interativo através de um túnel criado com acesso privado ou corporativo.
O token deve ser passado através do cabeçalho X-Tunnel-Authorization tunnel <TOKEN>, se o cabeçalho não for informado o acesso será bloqueado:
Menu de contexto destacando a opção Copy Tunnel Access Token
Outras opções
Dev Tunnels no Visual Studio oferecem uma alternativa simples e eficiente para cenários onde é necessário depurar aplicações em que os endpoints devam obrigatoriamente ser acessíveis a partir da Internet, como é o caso de aplicações que expõem webhooks, sem que sejam necessárias configurações na infraestrutura de rede.
Existem outras soluções como é o caso do NGROK que é um serviço que também permite criar túneis e expor aplicações através desses túneis. O NGROK possui um nível gratuito de serviço, que tem funcionalidades equivalentes às oferecidas pelo Visual Studio, e também níveis pagos que agregam outras funcionalidades, como por exemplo domínios personalizados.
Outra opção que pode ser utilizada é publicar a aplicação em um Azure App Service configurado para depuração remota, nesse caso é possível anexar o processo em execução no App Service e depurar remotamente com o Visual Studio, o inconveniente desse modelo é a latência entre a máquina do desenvolvedor e a aplicação remota que torna o processo um pouco mais pesado.
Conclusões
Dev Tunnels facilitam a vida do desenvolvedor em cenários onde é necessário expor a aplicação externamente como é o caso do desenvolvimento de webhooks, mas não só, servem também para testar aplicações Web em múltiplos dispositivos ou para disponibilizar uma aplicação temporariamente para demonstrações ou avaliações.
Em um próximo artigo vamos explorar o uso de Dev Tunnels para depuração de chamadas feitas a partir de serviços externos.
Referências
Como usar túneis de desenvolvimento no Visual Studio 2022 com aplicativos ASP.NET Core
Dev tunnels in Visual Studio 2022
NGROK Web site
ngrok for Enterprise | Developer productivity
Continue reading...