Em setembro/2021 fizemos a atualização do aplicativo para a framework IONIC 5.0 e hoje estamos na versão 7.0. A partir da versão 5.0 em relação a versão anterior, tivemos algumas mudanças, as principais delas foram a utilização do mecanismo de CORS, a autenticação por bearer token e a nova forma de comunicação entre o aplicativo e o servidor de aplicação.

O que é CORS?

O CORS (Cross-origin Resource Sharing) é um mecanismo utilizado pelos navegadores para compartilhar recursos entre diferentes origens. O CORS é uma especificação do W3C e faz uso de headers do HTTP para informar aos navegadores se determinado recurso pode ser ou não acessado.

Cross-Origin Resource Sharing (CORS, Compartilhamento de recursos de origem  cruzada) - AWS SDK for JavaScript

IONIC e CORS

A partir da versão 5.0 do Ionic todas as requisições qualificadas nos critérios acima, utilizam o mecanismo de CORS. Para isso, os backends devem estar preparados para responder de maneira correta as requisições do tipo OPTIONS. No caso do Ionic temos duas origens diferentes para cada um dos tipos de plataforma, Android e IOS:

Plataforma

Origem

Androidhttp://localhost
IOScapacitor://localhost


Para atender o correto funcionamento do mecanismo de CORS e mantendo a infraestrutura que os clientes já possuíam, estamos utilizando agora o modelo de API's do host disponibilizadas pelo nosso time de framework. Além disso, caso o servidor web utilizado seja IIS, realizar a instalação do módulo adicional de CORS https://www.iis.net/downloads/microsoft/iis-cors-module. Para o correto funcionamento do CORS em RM, são necessários 3 cabeçalhos na resposta das requisições de OPTIONS:


Referência de apoio: https://ionicframework.com/docs/troubleshooting/cors

Bearer token

Outra novidade na versão do Ionic 5 é a utilização do bearer token para autenticação do usuário ao invés do processo de basic authentication. A bearer authentication (também chamada de autenticação por token) é um esquema de autenticação HTTP que envolve tokens de segurança chamados bearer tokens. O nome "Bearer token" pode ser entendido como "dar acesso ao portador deste token". O bearer token é uma string criptografada, gerada pelo servidor em resposta a uma solicitação de login. O client deve enviar este token no cabeçalho de autorização ao fazer solicitações para recursos protegidos. Utilizamos a API Autorização / Autenticação Basic e Bearer Token que retorna um token contendo as informações do usuário e outras claims que são relevantes para ele.


Instruções para configuração:


Pelas especificações de infraestrutura dos clientes, já temos algumas ações mapeadas que podem resolver os problemas de configuração de ambiente. O primeiro passo é seguir os passos descritos no KCS e realizar todas as configurações descritas. Dentre os casos mapeados, temos:

IMPORTANTE: Em todos os cenários mapeados, é necessário seguir os passos do KCS. Além disso, a reserva das portas deve ser feita em todos os servidores que possuam serviços ativos de host.

Portal e biblioteca instalados no mesmo servidor (Servidor WEB + Servidor de Aplicação)

Seguir apenas o KCS

Portal e biblioteca instalados em servidores distintos (N Camadas)

A primeira verificação que deve ser feita é se o servidor de portal consegue "acessar" o servidor de aplicação e como ele faz isso (Através de IP, hostname, DNS, etc). Além disso, é necessário que a comunicação entre o servidor de portal e o de aplicação seja realizada através das portas APIs configuradas no serviços de host. Caso exista algum mecanismo de segurança entre a comunicação dos dois servidores (firewall, antivírus, proxy, etc) é necessário criar regras para liberar as portas API, caso contrário o aplicativo não irá funcionar. Por padrão o servidor de portal tentará se comunicar com o servidor de aplicação através do hostname. Se não for adequado para a configuração do cliente a utilização do hostname, será necessário adicionar a tag Host dentro dos arquivos RM.Host.Service.exe.config, contendo o IP da respectiva máquina.

Outras configurações

Existem algumas configurações que podem ser utilizadas independente de como o cliente organizou sua infraestrutura. Abaixo listamos algumas das que já foram mapeadas.

WebService - ServicesHostName

Em casos onde tenha WebService configurado através da tag ServicesHostName no RM.Host.Service.exe.config, a comunicação será feita através do endereço do WebService utilizando as portas de API configuradas no serviço de host.

OBS: Caso o cliente utilize a tag <add key="EnableWSSecurity" value="true" />, onde habilita a comunicação segura no host, as requisições entre o servidor de portal e o servidor de aplicação utilizaram o protocolo HTTPS. Nesses casos é obrigatória a configuração da tag ServicesHostName pois o domínio precisa ser certificado.

SubDomainMask ou múltiplas pastas FrameHTML

Existem casos onde o cliente utiliza apenas um servidor de aplicação que atende a diversos servidores de portal. Ele pode utilizar a configuração de Multi Tenancy(Configurando o RM Multi Tenancy (Multi Alias)) ou replicar diversas pastas FrameHTML apontando para o servidor de aplicação. Nesses casos não se pode utilizar a tag DefaultDB dentro dos serviços de host e sim a tag ServiceAlias dentro do arquivo Web.config na pasta FrameHTML. Além disso, é necessário adicionar a tag <add key="ConsiderServiceAliasMyHr" value="true" /> dentro do arquivo Web.config (Caso existam réplicas da pasta FrameHTML, copiar para todos).

Clientes que utilizam Proxy Reverso ou mecanismos de encaminhamento

Caso os cabeçalhos de CORS não estejam sendo repassados corretamente para o Client, mesmo criando regras de encaminhamento, é necessário fazer uma configuração adicional dentro do IIS. Após realizar a instalação do módulo adicional de CORS https://www.iis.net/downloads/microsoft/iis-cors-module, é necessário adicionar as linhas dentro do web.config dentro da pasta FrameHTML na seção system.webServer

Configuração CORS IIS

<system.webServer>
    <cors enabled="true">
        <add origin="http://localhost" allowCredentials="true" maxAge="120">
            <allowHeaders allowAllRequestedHeaders="true">
                <add header="Content-Type" />
            </allowHeaders>
            <allowMethods>
                <add method="GET" />
                <add method="PUT" />
                <add method="POST" />
                <add method="OPTIONS" />
                <add method="DELETE" />
            </allowMethods>
            <exposeHeaders>
                <add header="Content-Type" />
            </exposeHeaders>
        </add>
        <add origin="ionic://localhost" allowCredentials="true" maxAge="120">
            <allowHeaders allowAllRequestedHeaders="true">
                <add header="Content-Type" />
            </allowHeaders>
            <allowMethods>
                <add method="GET" />
                <add method="PUT" />
                <add method="POST" />
                <add method="OPTIONS" />
                <add method="DELETE" />
            </allowMethods>
            <exposeHeaders>
                <add header="Content-Type" />
            </exposeHeaders>
        </add>
        <add origin="capacitor://localhost" allowCredentials="true" maxAge="120">
            <allowHeaders allowAllRequestedHeaders="true">
                <add header="Content-Type" />
            </allowHeaders>
            <allowMethods>
                <add method="GET" />
                <add method="PUT" />
                <add method="POST" />
                <add method="OPTIONS" />
                <add method="DELETE" />
            </allowMethods>
            <exposeHeaders>
                <add header="Content-Type" />
            </exposeHeaders>
        </add>
    </cors>
</<system.webServer>



Importante: 

Caso tenha alguma dúvida relacionado a essa configuração, entrar em contato com o nosso atendimento.



  • Sem rótulos