Produto: | TOTVS Automação Fiscal |
Versões: | 12.1.27+ |
Este documento tem o objetivo de fornecer informações para utilização do Web Service REST, para SETUP automático do TOTVS Automação Fiscal.
Para mais detalhes sobre o conceito de um serviços REST clique aqui.
Para mais detalhes sobre serviços REST na arquitetura Protheus clique aqui.
Definição do Serviço
Nome: WSTSSAUTH
Objetivo: Obter o Token de Autenticação JWT do serviço TSS através das chaves Client Id e Client Secret.
Métodos: POST
Configurações do Serviço
A Configuração do serviço REST está documentada no link Configuração REST SERVER - Protheus.
Estas parametrizações estão localizadas fisicamente no arquivo appserver.ini da pasta de instalação "[...]\BIN\APP"
Importante
Na seção HTTPURI, a chave PrepareIn deve ser comentada.
Segue exemplo de configuração do WS REST para utilização no modulo TAF:
[HTTPV11] SOCKETS=HTTPREST ENABLE=1 [HTTPREST] Port=8080 URIs=HTTPURI Security=1 [HTTPURI] URL=/rest ;PrepareIn= Instances=1,2 CORSEnable=1 AllowOrigin=* [HTTPJOB] MAIN=HTTP_START ENVIRONMENT=P12 [TAF_CFGJOB] Main=TAF_CFGJOB Instances=1,2,1,1 PrepareIn=T1 RefreshRate=50 ENVIRONMENT=P12 [OnStart] JOBS=HTTPJOB,TAF_CFGJOB RefreshRate=120
Instances
A chave Instances na seção TAF_CFGJOB é opcional, se a mesma não existir o sistema ira considerar a quantidade de threads declarada na chave instances da seção HTTPURI.
PrepareIn
A chave PrepareIn deve conter o código do Grupo de Empresas(sigamat.emp/syscompany) utilizado no modulo TAF, abaixo exemplos configurações possíveis para as mesmas:
- Utilizando o código do grupo; Ex: PrepareIn=01
- Utilizando diversos códigos de grupos; Ex: PrepareIn=01,02,99 .
- Utilizando a palavra ALL, neste caso o server vai considerar todos os grupos contidos no arquivo de empresas do Protheus/TAF; Ex PrepareIn=ALL
Consumo de Memória e CPU
O servidor cria Threads especificas para cada grupo de empresas de acordo com a configuração da chave Instances, por isso essa configuração deve ser realizada considerando a capacidade computacional do servidor.
Definição dos métodos
POST
Descrição do Método: O método POST segue o conceito do próprio método em qualquer outro tipo de serviço REST, devendo seu conteúdo ser enviado no corpo da mensagem (body) no formato json.
O objetivo deste método no serviço WSTSSToken é obter um token JWT do serviço TSS utilizando as credenciais de autenticação previamente cadastradas conforme documento: https://tdn.totvs.com/x/1RhcIw
Estrutura da mensagem enviada no POST (Request):
Atributo | Pai | Nivel | Ocorrência | Formato |
---|---|---|---|---|
urlTSS | - | 1 | 1 | STRING |
grantType | - | 1 | 1 | NUMERICO |
clientId | - | 1 | 0-1 | STRING |
clientSecret | - | 1 | 0-1 | STRING |
refreshToken | - | 1 | 0-1 | STRING |
- urlTSS – URL do Serviço TSS
- grantType - Tipo da Requisição.
Valores: 1 para geração do token (CLIENT_CREDENTIALS) e 2 para a atualização do token (REFRESH_TOKEN).
- clientId - Id da credencial gerada pelo TSS
- clientSecret - Senha da credencial gerada pelo TSS
- refreshToken - Token para atualização do tempo de expiração, o mesmo pode ser utilizado para substituir o clientId e clientSecret após a primeira requisição.
Geração das Credenciais
Mais informações sobre a geração das credenciais no TSS estão contidas neste documento: https://tdn.totvs.com/x/1RhcIw
Atenção!
Os atributos não obrigatórios têm que fazer parte da estrutura, somente o seu preenchimento é opcional.
Estrutura da mensagem de retorno do POST (Response):
Atributo | Pai | Nivel | Ocorrência | Formato |
---|---|---|---|---|
accesstoken | - | 1 | 1 | STRING |
expiresIn | - | 1 | 1 | NUMERICO |
refreshToken | - | 1 | 1 | STRING |
tokenType | - | 1 | 1 | STRING |
- accesstoken – Token de autenticação
- expiresIn - Tempo de expiração do token (em segundos), esse parâmetro é retornado de acordo com a configuração da chave TSSTOKEN_TIMEEXP no arquivo de de configuração do TSS (appserver.ini)
- refreshToken - Token para atualização do tempo de expiração
- tokenType - Neste parâmetro sempre será retornado "Bearer" que é o padrão de autenticação que está sendo utilizado para geração do token.
Exemplo do Request para o método POST:
Geração do Token
{ "urlTSS": "10.171.67.235:8092", "grantyType": 1, "clientId": "bd1e28d4dfbb0d66b640ea94298b2e77c443334c", "clientSecret": "19521598819c1fd3bd2b465b4230o1e1f41c64e1f4a09130afacc1f572df1d23" }
Response:
{ "accesstoken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRpZCI6IjE2ODA1NmNjLTczNTYtNDAwMC04NUI0LWZlNjhiMjZhYjJjZiIsICJjbGllbnRfaWQiOiJiZDFlMjhkNGRmYmIwZDY2YjY0MGVhOTQyOThiMmU3N2MyNDMzMzRjIiwiaXNzIjoiVE9UVlNfVFNTXzEyLjEuMDMzIiwiaWF0IjoxNjMxNzkyNTY0LCJleHAiOjE2MzE3OTQzNjV9.YjVkNjRmMmNkODQ5MjhmZjUzYzljMmJkMDU1MWQ4ZjNlNzgzNWQ5OWUwMTAyNTFiNWUwNDNlYTIzMDU0NGYxOGFkYzVhMzQ3YWZmZWQwNmRiNDA3OWMzNjYxNDkxNGU4OGYwNmJkZTFhMzEyYjc1ZDdjNTljMjMwNTU0Yjg5YWM", "expiresIn": 1800, "refreshToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRpZCI6IjE2ODA1NmNjLTczNTYtNDAwMC04NUI0LWZlNjhiMjZhYjJjZiIsICJjbGllbnRfaWQiOiJiZDFlMjhkNGRmYmIwZDY2YjY0MGVhOTQyOThiMmU3N2MyNDMzMzRjIiwiaXNzIjoiVE9UVlNfVFNTXzEyLjEuMDMzIiwiaWF0IjoxNjMxNzkyNTY1LCJleHAiOjE2MzE4Nzg5NjV9.ODRlZmM5NTViZDZkNjJiOTAyZmU3OWE3ZmI4NDNkOGZlZWU4ZTE1NWIwMzI4YzEyZWU3NTMzNGE2OWMzYWE2MDVhMDlkOTE0ZjFmZTU3ZDFhYTRkZDY2ZWRhNmFjZTEzYjYxZDIyZWJiMzhjMWJmMzFhNmY4NTMwMjdkOTI2NzY", "tokenType": "Bearer" }
Atualização do Token
{ "urlTSS": "10.171.67.235:8092", "grantType": 2, "refreshToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRpZCI6IjE2ODA1NmNjLTczNTYtNDAwMC04NUI0LWZlNjhiMjZhYjJjZiIsICJjbGllbnRfaWQiOiJiZDFlMjhkNGRmYmIwZDY2YjY0MGVhOTQyOThiMmU3N2MyNDMzMzRjIiwiaXNzIjoiVE9UVlNfVFNTXzEyLjEuMDMzIiwiaWF0IjoxNjMxNzkyNTY1LCJleHAiOjE2MzE4Nzg5NjV9.ODRlZmM5NTViZDZkNjJiOTAyZmU3OWE3ZmI4NDNkOGZlZWU4ZTE1NWIwMzI4YzEyZWU3NTMzNGE2OWMzYWE2MDVhMDlkOTE0ZjFmZTU3ZDFhYTRkZDY2ZWRhNmFjZTEzYjYxZDIyZWJiMzhjMWJmMzFhNmY4NTMwMjdkOTI2NzY", }
Response:
{ "accesstoken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRpZCI6IjE2ODA1NmNjLTczNTYtNDAwMC04NUI0LWZlNjhiMjZhYjJjZiIsICJjbGllbnRfaWQiOiJiZDFlMjhkNGRmYmIwZDY2YjY0MGVhOTQyOThiMmU3N2MyNDMzMzRjIiwiaXNzIjoiVE9UVlNfVFNTXzEyLjEuMDMzIiwiaWF0IjoxNjMxNzkzOTI4LCJleHAiOjE2MzE3OTU3Mjl9.NzM5OTkxZjVhNzViYjA1OTVkMzlmYWU2YmFiMTFkNjlmYWY5NDMyODRkZmNlZDQwMWIyZTE3N2U1ODIzMDMxMThiZTZmNjZhMTUyMTYyODQ0ODMzOGE3M2FlZGMxZDNjYjM1ZmQ0MGFmOTBhYjU3MDZmNjczZWU4MWFjMzI4OGE", "expiresIn": 1800, "refreshToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRpZCI6IjE2ODA1NmNjLTczNTYtNDAwMC04NUI0LWZlNjhiMjZhYjJjZiIsICJjbGllbnRfaWQiOiJiZDFlMjhkNGRmYmIwZDY2YjY0MGVhOTQyOThiMmU3N2MyNDMzMzRjIiwiaXNzIjoiVE9UVlNfVFNTXzEyLjEuMDMzIiwiaWF0IjoxNjMxNzkzOTI4LCJleHAiOjE2MzE4ODAzMjh9.NjE0OTNmOWEzODEwNmQ4NDhmNGY5MWM4YjE3NDFjYTllZDI3MTczOWY2MmNlNGQzOTc1ZDVlZDk0YjNkNGUyZGI5ZDJlYWQ2NGVlMzFjZTQ2Y2VjZWU3N2JlODQ4ZTY3NGVlZjg5YjE2NmVkYjFiN2FhNzRmMDZhMWIwNTc1ZjI", "tokenType": "Bearer" }
Atualização do Token
O refreshToken não é fixo, a cada atualização será gerado um hash novo que deverá ser utilizado na próxima atualização de token.