01. DADOS GERAIS
| Produto: | TOTVS Logística Recintos Aduaneiros
|
|---|---|
| Linha de Produto: | Linha Logix |
| Segmento: | Logística |
| Módulo: | Checklist |
| Função: | Autenticação e Integração |
| Ticket: | |
| Requisito/Story/Issue (informe o requisito relacionado) : |
02. SITUAÇÃO/REQUISITO
Para atender à necessidade de integração entre o ecossistema TOTVS Logística Recintos Aduaneiros e o produto Checklist da Suíte Logística, fez-se necessária a criação de uma API Gateway que intermediará as requisições.
03. SOLUÇÃO
Para a integração, foi desenvolvida uma API RESTful que intermedia a comunicação entre o ecossistema e outras APIs RESTful. Esta intermediação pode ser feita com ou sem tradução da requisição em um modelo ou protocolo diverso do protocolo HTTP/1.1, desde que devidamente implementada.
A implementação destas integrações e traduções se dará por meio de classes implementadas e adicionadas ao módulo Apache resultante da compilação, baseadas na interface IGatewayBase, disponível internamente no projeto.
A API será responsável, quando necessário, pela autenticação na API destino, reservando seu token em cache para futuras chamadas até sua expiração. Uma vez expirado, o token é eliminado, sendo necessário obter um novo.
As definições, bem como as opções de implantação, podem ser vistas abaixo:
São interfaces disponibilizadas na aplicação para uso na expansão das integrações:
A interface IStrategyAuthenticator define as formas de autenticação que poderão ser usadas pela integração.
function SetAuthURL(const AValue: string): IStrategyAuthenticator;
function SetParam(const AName, AValue: string): IStrategyAuthenticator;
function SetParams(const AValue: TStrings): IStrategyAuthenticator;
function Authenticate(out AToken: string): THTTPCode;
- ExpiresIn: Cardinal;
- TokenType: string;
A interface IStrategyAuthContainer define o contêiner de armazenamento das definições de classes baseadas na interface IStrategyAuthenticator.
- function AddAuthenticator(const AName: string; const AAuthenticator: TStrategyAuthenticatorClass): IStrategyAuthContainer;
- function RemoveAuthenticator(const AName: string): IStrategyAuthContainer;
- function Clear: IStrategyAuthContainer;
- function SelectAuthenticator(const AName: string): IStrategyAuthContainer;
- function SetAuthURL(const AValue: string): IStrategyAuthContainer;
- function SetParam(const AName, AValue: string): IStrategyAuthContainer;
- function Authenticate(out AToken: string): THTTPCode;
- Authenticator[const AName: string]: IStrategyAuthenticator;
- Authenticators: TArray<string>;
A interface IGatewayBase define as classes de integração que podem ser agregadas à API.
- function SetAuthenticator(const AAuthenticator: IStrategyAuthenticator): IGatewayBase;
- function SetRedisConnector(const AValue: IRedisConnector): IGatewayBase;
- function TreatRequest(const ARequest: TWebRequest; const AResponse: TWebResponse; const APathInfo: TArray<string>): THTTPCode;
Não há propriedades expostas.
A interface IGatewayFactory define a estrutura que armazena as definições das classes baseadas na interface IGatewayBase.
- function GetResource(const AKey: string): IGatewayBase;
- function RegisterResource(const AKey: string; const AResource: TGatewayBaseClass): IGatewayFactory;
- function Resources: TArray<string>;
Não há propriedades expostas.
Este é o fluxo básico de operação das classes agregadas à API Gateway .
São opções de deploy da API Gateway:
A compilação pode ser feita para as seguintes arquiteturas:
- 32 bits (obsoleta)1
- 64 bits
E deve obedecer a configuração Release.
Notas
1 - A Apache Foundation considera a compilação do servidor web Apache para 32 bits como obsoleta, mantida externamente por outras equipes, apenas para o sistema operacional Microsoft Windows. A opção para a compilação para a plataforma Microsoft Windows 32 bits foi mantida exclusivamente para uso com o produto REST Server, caso o cliente não queira fazer uso de outra instalação do servidor web Apache em sua infraestrutura.
As linhas a seguir devem ser adicionadas ao arquivo httpd.conf.
LoadModule cesgw_module modules/mod_cesgw.so
<IfModule cesgw_module>
<Location /api/tlra/cesgw/v1>
SetHandler mod_cesgw-handler
</Location>
</IfModule>
Após a alteração do arquivo, é necessário reiniciar o servidor Apache.
A API depende diretamente do banco de dados Redis, devendo este ser instalado no mesmo servidor.
A compilação deve ser feita para a plataforma Linux 64 bits, usando a configuração Release.
A configuração da API depende destes dois arquivos, os quais devem ser colocados no diretório /etc/apache2/mods-available.
LoadModule cesgw_module /usr/lib/apache2/modules/mod_cesgw.so
<IfModule cesgw_module>
<Location /api/tlra/cesgw/v1>
SetHandler mod_cesgw-handler
</Location>
</IfModule>
Após a cópia dos arquivos para o diretório indicado, a seguinte sequência de comandos deve ser executada:
# a2enmod cesgw
# systemctl restart apache2
A API depende diretamente do banco de dados Redis, devendo este ser instalado no mesmo servidor.
A compilação da API deve obedecer os princípios descritos na compilação para ambientes Linux 64 bits.
A árvore de diretórios deve conter a seguinte estrutura:
Diretório de trabalho | +-mod_cesgw.so +-cesgw.conf +-cesgw.load +-cesgw.dockerfile
O arquivo cesgw.dockerfile deve conter:
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
# Instala Apache2 e Redis
RUN apt-get update && \
apt-get install -y apache2 redis-server && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Cria diretórios necessários
RUN mkdir -p /usr/lib/apache2/modules \
/etc/apache2/mods-available \
/etc/apache2/mods-enabled \
/var/log/totvs
RUN chmod 777 /var/log/totvs
# Copia o módulo e suas configurações
COPY mod_cesgw.so /usr/lib/apache2/modules/mod_cesgw.so
COPY cesgw.conf /etc/apache2/mods-available/cesgw.conf
COPY cesgw.load /etc/apache2/mods-available/cesgw.load
# Ativa o módulo
RUN a2enmod cesgw
# Expor a porta 80
EXPOSE 80
# Script de inicialização que roda o Redis e Apache juntos
CMD service redis-server start && apachectl -D FOREGROUND
E a criação da imagem é feita por meio dos comandos a seguir:
- Docker
- docker build -t tlra-cesgw:latest . -f ./cesgw.dockerfile
- docker build -t tlra-cesgw:latest . -f ./cesgw.dockerfile
- Podman
- podman build -t tlra-cesgw:latest . -f ./cesgw.dockerfile
- podman build -t tlra-cesgw:latest . -f ./cesgw.dockerfile
Tendo sido criada a imagem, ela pode ser disponibilizada por meio dos seguintes comandos:
- Docker
- docker tag tlra-cesgw:latest docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- docker push docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- Podman
- podman tag tlra-cesgw:latest docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- podman push docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
Uma vez disponibilizada, a imagem pode ser obtida por meio dos seguintes comandos:
- Docker
- docker pull docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- docker pull docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- Podman
- podman pull docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
E sua inicialização pode ser comandada utilizando os seguintes comandos:
- Docker
- docker run -d -p 8080:80 docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- docker run -d -p 8080:80 docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- Podman
- podman run -d -p 8080:80 docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
- podman run -d -p 8080:80 docker.totvs.io/tlra-cesgw/tlra-cesgw:latest
04. AÇÕES PÓS IMPLANTAÇÃO
Após o término da implantação e de posse de um token JWT válido, uma chamada para um endpoint de configuração deve ser realizada para determinar os parâmetros de operação do gateway selecionado.
Abaixo temos o exemplo de configuração do gateway checklist:

