Documentação de Autenticação Externa do Portal Prestador

Introdução

A autenticação externa do Portal Prestador permite que aplicações terceiras possam se integrar e incorporar (embed) funcionalidades do portal em suas próprias interfaces. Esta documentação detalha o processo de autenticação, os campos necessários, o fluxo de operação e exemplos de implementação.

Visão Geral do Processo

O processo de autenticação externa consiste em:

  1. Realizar uma chamada à API de autenticação externa
  2. Receber e armazenar o token JWT
  3. Utilizar o token para incorporar funcionalidades do Portal Prestador em aplicações externas

Endpoint de Autenticação

POST https://portal.totvs.com.br/totvs-hgp-haw-auth/api/external-authentication

Headers Necessários

Content-Type: application/json


cUrl de exemplo da requisição

curl --location 'http://52.20.6.162:8080/totvs-hgp-haw-auth/api/external-authentication' \
--header 'Accept: /' \
--header 'Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7' \
--header 'Cache-Control: no-cache' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/json' \
--header 'Origin: https://pmedfake.totvs.com.br:4433' \
--header 'Pragma: no-cache' \
--header 'Referer: https://pmedfake.totvs.com.br:4433/' \
--header 'Sec-Fetch-Dest: empty' \
--header 'Sec-Fetch-Mode: cors' \
--header 'Sec-Fetch-Site: same-site' \
--header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36' \
--header 'sec-ch-ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"' \
--header 'sec-ch-ua-mobile: ?0' \
--header 'sec-ch-ua-platform: "Windows"' \
--data '{
    "user": "31921",
    "password": "174b063a7d7e684004d94f4965b52ad9",
    "cnpjClinic": "03.151.186/0001-78",
    "clinic": 10026,
    "provider": 31921,
    "beneficiaryCard": "01200108959000048"
}'


Corpo da Requisição (Request Body)

O corpo da requisição deve conter os seguintes campos em formato JSON:

CampoTipoObrigatórioDescrição
userStringSimNome de usuário registrado no Portal Prestador
passwordStringSimSenha do usuário (hash MD5)
cnpjClinicStringNãoCNPJ da clínica apenas números (obrigatório apenas se não informar clinic)
clinicNumberNãoCódigo da clínica (obrigatório apenas se não informar cnpjClinic
providerNumberNãoCódigo do prestador
beneficiaryCardStringNãoNúmero do cartão de beneficiário

Exemplo de corpo da requisição:

{ 
	"user": "nome.usuario", 
	"password": "174b063a7d7e684004d94f4965b52ad9", 
	"cnpjClinic": "03151186000178", 
    "clinic": 10026,
	"provider": 31921, 
	"beneficiaryCard": "01200108959000048" 
}


Observação: A senha deve ser enviada em formato hash MD5.

Resposta da API

Em caso de sucesso (HTTP 200 OK)

{
  "companyId": "120",
  "secretary": "daniel.jose",
  "beneficiaryCard": "01200108959000048",
  "provider": 31921,
  "clinic": 10026,
  "authorized": true,
  "token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIwMjAwMTBhQUlXWVhaQ2ZUSjNDY21aWmNxVnFRMzMiLCJpYXQiOjE3NDM1MTEyNTMsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiMGE2NDYyNzMtZjNkZC00ODY5LWIyMDEtNGU2YTVhNmQ1MDllIiwiZXhwIjoxNzQzNTEzMDUzLCJhdWQiOiJsb2NhbGhvc3QuODI4MCIsInNjb3BlIjpbIi9wb3J0cHJlc3QiXX0.GPHI8uvCB7APDiB_3g7DWVB25sBOi_GV7xGJ2B2lsYu3oVW0CRVVEoq6hT1bkJBkTcDHnOtUrNrDL761V56IqUJdXQ3OO_ToZv3t94nu4VERGNYWgqPkLHohQvnLjdlFAS5mkjVdZ545L-jOyHGrDuVzf9VzqkjpGVnfJBgkajYar1BJePtf9oiFWkBu8Pn5OxeQVFjhFI07WKHlPomEfnDYLSj6g8yTyitbo_aM4nO82EMiJGVSkBYbBqZJdmS2IzmRAA27Pam5KCUkYKl3INnlUu1P0FVwgiF4EZdklMMYRIybseYetfwboYmpyWsoBE2WMjHsGhOgGlfZSnY0ig",
  "hybridToken": "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjE3NGIwNjNhN2Q3ZTY4NDAwNGQ5NGY0OTY1YjUyYWQ5Iiwic2VjcmV0YXJ5IjoiZGFuaWVsLmpvc2UiLCJiZW5lZmljaWFyeUNhcmQiOiIwMTIwMDEwODk1OTAwMDA0OCIsInByb3ZpZGVyIjozMTkyMSwiY2xpbmljIjoxMDAyNiwiZXhwIjoxNzQzNTE0ODU5LCJpYXQiOjE3NDM1MTEyNTl9.QKNHJLfAyxYgrHbCZhptRs6wM41VGnwel2LS93HyzEI",
  "datasulToken": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhY2FhZmM1ZS04NWYyLTA3YmYtNDIxNC01ZDk5MmMwOTRkODYiLCJpYXQiOjE3NDM1MTEyNTcsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiZWZlNDI2NmUtZmZmMi00NjJjLWE0MzktNmY2M2M1ODFlNzgxIiwiZXhwIjoxNzQzNTEzMDU3LCJhdWQiOiJsb2NhbGhvc3QuODI4MCIsImNvbXBhbnlJZCI6ImQyZTk4NzQ4LTE4MTgtYjA5OC05ZTE0LWZlZDkzODg4NGNiMyIsInNjb3BlIjpbIi9oc3YiLCIvdHJlcCJdfQ.eMngMva-zBHzmvrFdQxX4RG0Ey2i_I5SIRNwS0amAfj2XUrDfzAzV6spGcbdHQeBjftghhYJWWR0HP2Y1DLgUGs8KGAfQJFtu9om0hmWH72P1faI_CtIV9qG0VchVwkYpVw91KnCiCyayo8_uDP3cARKCQOuHasxebsKzXDn76Q-2u_rBUPEZhC7jGK-QIaNQX5ELUA4MWaJs5p58B0VsTX_LJbAtzfQbNv_ttFTZJUUzX7dorOOyYAv_LI7UikfWs1QGUQyx8_q962GvtgY6a9DlcLtXwfuxIr6-_4y8NldilHPYemGbfRumU5fqcfZ9lCwD0_wxpB9oIranL589w",
  "externalToken": "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjE3NGIwNjNhN2Q3ZTY4NDAwNGQ5NGY0OTY1YjUyYWQ5IiwiY29tcGFueUlkIjoiMTIwIiwic2VjcmV0YXJ5IjoiZGFuaWVsLmpvc2UiLCJiZW5lZmljaWFyeUNhcmQiOiIwMTIwMDEwODk1OTAwMDA0OCIsInByb3ZpZGVyIjozMTkyMSwiY2xpbmljIjoxMDAyNiwiZXhwIjoxNzQzNTE0ODU5LCJsb2dpbkRhdGEiOnsiY29tcGFueUlkIjoiMTIwIiwic2VjcmV0YXJ5IjoiZGFuaWVsLmpvc2UiLCJiZW5lZmljaWFyeUNhcmQiOiIwMTIwMDEwODk1OTAwMDA0OCIsInByb3ZpZGVyIjozMTkyMSwiY2xpbmljIjoxMDAyNiwiYXV0aG9yaXplZCI6dHJ1ZSwidG9rZW4iOiJleUpoYkdjaU9pSlNVekkxTmlKOS5leUp6ZFdJaU9pSXdNakF3TVRCaFFVbFhXVmhhUTJaVVNqTkRZMjFhV21OeFZuRlJNek1pTENKcFlYUWlPakUzTkRNMU1URXlOVE1zSW1semMzVmxjaUk2SW1SaGRHRnpkV3dpTENKcGMzTWlPaUprWVhSaGMzVnNJaXdpYW5ScElqb2lNR0UyTkRZeU56TXRaak5rWkMwME9EWTVMV0l5TURFdE5HVTJZVFZoTm1RMU1EbGxJaXdpWlhod0lqb3hOelF6TlRFek1EVXpMQ0poZFdRaU9pSnNiMk5oYkdodmMzUXVPREk0TUNJc0luTmpiM0JsSWpwYklpOXdiM0owY0hKbGMzUWlYWDAuR1BISTh1dkNCN0FQRGlCXzNnN0RXVkIyNXNCT2lfR1Y3eEdKMkIybHNZdTNvVlcwQ1JWVkVvcTZoVDFia0pCa1RjREhuT3RVck5yREw3NjFWNTZJcVVKZFhRM09PX1RvWnYzdDk0bnU0VkVSR05ZV2dxUGtMSG9oUXZuTGpkbEZBUzVta2pWZFo1NDVMLWpPeUhHckR1VnpmOVZ6cWtqcEdWbmZKQmdrYWpZYXIxQkplUHRmOW9pRldrQnU4UG41T3hlUVZGamhGSTA3V0tIbFBvbUVmbkRZTFNqNmc4eVR5aXRib19hTTRuTzgyRU1pSkdWU2tCWWJCcVpKZG1TMkl6bVJBQTI3UGFtNUtDVWtZS2wzSU5ubFV1MVAwRlZ3Z2lGNEVaZGtsTU1ZUkl5YnNlWWV0Zndib1ltcHlXc29CRTJXTWpIc0doT2dHbGZaU25ZMGlnIiwiaHlicmlkVG9rZW4iOiJleUpoYkdjaU9pSklVekkxTmlKOS5leUp3WVhOemQyOXlaQ0k2SWpFM05HSXdOak5oTjJRM1pUWTROREF3TkdRNU5HWTBPVFkxWWpVeVlXUTVJaXdpYzJWamNtVjBZWEo1SWpvaVpHRnVhV1ZzTG1wdmMyVWlMQ0ppWlc1bFptbGphV0Z5ZVVOaGNtUWlPaUl3TVRJd01ERXdPRGsxT1RBd01EQTBPQ0lzSW5CeWIzWnBaR1Z5SWpvek1Ua3lNU3dpWTJ4cGJtbGpJam94TURBeU5pd2laWGh3SWpveE56UXpOVEUwT0RVNUxDSnBZWFFpT2pFM05ETTFNVEV5TlRsOS5RS05ISkxmQXl4WWdySGJDWmhwdFJzNndNNDFWR253ZWwyTFM5M0h5ekVJIiwiZGF0YXN1bFRva2VuIjoiZXlKaGJHY2lPaUpTVXpJMU5pSjkuZXlKemRXSWlPaUpoWTJGaFptTTFaUzA0TldZeUxUQTNZbVl0TkRJeE5DMDFaRGs1TW1Nd09UUmtPRFlpTENKcFlYUWlPakUzTkRNMU1URXlOVGNzSW1semMzVmxjaUk2SW1SaGRHRnpkV3dpTENKcGMzTWlPaUprWVhSaGMzVnNJaXdpYW5ScElqb2laV1psTkRJMk5tVXRabVptTWkwME5qSmpMV0UwTXprdE5tWTJNMk0xT0RGbE56Z3hJaXdpWlhod0lqb3hOelF6TlRFek1EVTNMQ0poZFdRaU9pSnNiMk5oYkdodmMzUXVPREk0TUNJc0ltTnZiWEJoYm5sSlpDSTZJbVF5WlRrNE56UTRMVEU0TVRndFlqQTVPQzA1WlRFMExXWmxaRGt6T0RnNE5HTmlNeUlzSW5OamIzQmxJanBiSWk5b2MzWWlMQ0l2ZEhKbGNDSmRmUS5lTW5nTXZhLXpCSHptdnJGZFF4WDRSRzBFeTJpX0k1U0lSTndTMGFtQWZqMlhVckRmekF6VjZzcEdjYmRIUWVCamZ0Z2hoWUpXV1IwSFAyWTFETGdVR3M4S0dBZlFKRnR1OW9tMGhtV0g3MlAxZmFJX0N0SVY5cUcwVmNoVndrWXBWdzkxS25DaUN5YXlvOF91RFAzY0FSS0NRT3VIYXN4ZWJzS3pYRG43NlEtMnVfckJVUEVaaEM3akdLLVFJYU5RWDVFTFVBNE1XYUpzNXA1OEIwVnNUWF9MSmJBdHpmUWJOdl90dEZUWkpVVXpYN2Rvck9PeVlBdl9MSTdVaWtmV3MxUUdVUXl4OF9xOTYyR3Z0Z1k2YTlEbGNMdFh3ZnV4SXI2LV80eThObGRpbEhQWWVtR2JmUnVtVTVmcWNmWjlsQ3dEMF93eHBCOW9JcmFuTDU4OXciLCJleHRlcm5hbFRva2VuIjoiIiwiZXJyb3JDb2RlIjowLCJlcnJvck1lc3NhZ2UiOiIiLCJjbnBqQ2xpbmljIjoiIn0sImlhdCI6MTc0MzUxMTI1OX0.gPQhPMok27aAD0tG11VTk_LAI7Y1U_zRiU_uFtHiCUI",
  "errorCode": 0,
  "errorMessage": "",
  "cnpjClinic": ""
}

DatasulToken

//Decoded Header
{
  "alg": "RS256"
}

//Decoded Payload
{
  "sub": "acaafc5e-85f2-07bf-4214-5d992c094d86",
  "iat": 1742470961,
  "issuer": "datasul",
  "iss": "datasul",
  "jti": "becefb13-bcc5-4ed0-a0d5-e1e75ec28c14",
  "exp": 1742472761,
  "aud": "localhost.8280",
  "companyId": "d2e98748-1818-b098-9e14-fed938884cb3",
  "scope": [
    "*"
  ]
}

HybridToken

//Decoded Header
{
  "alg": "HS256"
}

//Decoded Payload
{
  "password": "174b063a7d7e684004d94f4965b52ad9",
  "secretary": "daniel.jose",
  "beneficiaryCard": "01200108959000048",
  "provider": 31921,
  "clinic": 10026,
  "exp": 1742474562,
  "iat": 1742470962
}

Token

//Decoded Header
{
  "alg": "RS256"
}

//Decoded Payload 
{
  "sub": "020010aAIWYXZCfTJ3CcmZZcqVqQ33",
  "iat": 1743511253,
  "issuer": "datasul",
  "iss": "datasul",
  "jti": "0a646273-f3dd-4869-b201-4e6a5a6d509e",
  "exp": 1743513053,
  "aud": "localhost.8280",
  "scope": [
    "/portprest"
  ]
}

ExternalToken

//Decode Header
{
  "alg": "HS256"
}

//Decode Payload
{
  "password": "174b063a7d7e684004d94f4965b52ad9",
  "companyId": "120",
  "secretary": "daniel.jose",
  "beneficiaryCard": "01200108959000048",
  "provider": 31921,
  "clinic": 10026,
  "exp": 1743514859,
  "loginData": {
    "companyId": "120",
    "secretary": "daniel.jose",
    "beneficiaryCard": "01200108959000048",
    "provider": 31921,
    "clinic": 10026,
    "authorized": true,
    "token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIwMjAwMTBhQUlXWVhaQ2ZUSjNDY21aWmNxVnFRMzMiLCJpYXQiOjE3NDM1MTEyNTMsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiMGE2NDYyNzMtZjNkZC00ODY5LWIyMDEtNGU2YTVhNmQ1MDllIiwiZXhwIjoxNzQzNTEzMDUzLCJhdWQiOiJsb2NhbGhvc3QuODI4MCIsInNjb3BlIjpbIi9wb3J0cHJlc3QiXX0.GPHI8uvCB7APDiB_3g7DWVB25sBOi_GV7xGJ2B2lsYu3oVW0CRVVEoq6hT1bkJBkTcDHnOtUrNrDL761V56IqUJdXQ3OO_ToZv3t94nu4VERGNYWgqPkLHohQvnLjdlFAS5mkjVdZ545L-jOyHGrDuVzf9VzqkjpGVnfJBgkajYar1BJePtf9oiFWkBu8Pn5OxeQVFjhFI07WKHlPomEfnDYLSj6g8yTyitbo_aM4nO82EMiJGVSkBYbBqZJdmS2IzmRAA27Pam5KCUkYKl3INnlUu1P0FVwgiF4EZdklMMYRIybseYetfwboYmpyWsoBE2WMjHsGhOgGlfZSnY0ig",
    "hybridToken": "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjE3NGIwNjNhN2Q3ZTY4NDAwNGQ5NGY0OTY1YjUyYWQ5Iiwic2VjcmV0YXJ5IjoiZGFuaWVsLmpvc2UiLCJiZW5lZmljaWFyeUNhcmQiOiIwMTIwMDEwODk1OTAwMDA0OCIsInByb3ZpZGVyIjozMTkyMSwiY2xpbmljIjoxMDAyNiwiZXhwIjoxNzQzNTE0ODU5LCJpYXQiOjE3NDM1MTEyNTl9.QKNHJLfAyxYgrHbCZhptRs6wM41VGnwel2LS93HyzEI",
    "datasulToken": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhY2FhZmM1ZS04NWYyLTA3YmYtNDIxNC01ZDk5MmMwOTRkODYiLCJpYXQiOjE3NDM1MTEyNTcsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiZWZlNDI2NmUtZmZmMi00NjJjLWE0MzktNmY2M2M1ODFlNzgxIiwiZXhwIjoxNzQzNTEzMDU3LCJhdWQiOiJsb2NhbGhvc3QuODI4MCIsImNvbXBhbnlJZCI6ImQyZTk4NzQ4LTE4MTgtYjA5OC05ZTE0LWZlZDkzODg4NGNiMyIsInNjb3BlIjpbIi9oc3YiLCIvdHJlcCJdfQ.eMngMva-zBHzmvrFdQxX4RG0Ey2i_I5SIRNwS0amAfj2XUrDfzAzV6spGcbdHQeBjftghhYJWWR0HP2Y1DLgUGs8KGAfQJFtu9om0hmWH72P1faI_CtIV9qG0VchVwkYpVw91KnCiCyayo8_uDP3cARKCQOuHasxebsKzXDn76Q-2u_rBUPEZhC7jGK-QIaNQX5ELUA4MWaJs5p58B0VsTX_LJbAtzfQbNv_ttFTZJUUzX7dorOOyYAv_LI7UikfWs1QGUQyx8_q962GvtgY6a9DlcLtXwfuxIr6-_4y8NldilHPYemGbfRumU5fqcfZ9lCwD0_wxpB9oIranL589w",
    "externalToken": "",
    "errorCode": 0,
    "errorMessage": "",
    "cnpjClinic": ""
  },
  "iat": 1743511259
}


Fluxo de Autenticação

  1. O cliente envia as credenciais para o endpoint de autenticação externa
  2. O backend Java recebe a requisição e encaminha para validação no sistema Progress 4GL
  3. O Progress verifica:
  4. Se as credenciais forem válidas:
  5. O cliente armazena o token JWT para uso posterior

Papéis de Usuário

O sistema identifica automaticamente o papel do usuário baseado nas credenciais:

Tratamento de Erros

Principais códigos de erro

Bloqueio de usuário

O sistema possui um mecanismo que bloqueia o usuário após múltiplas tentativas de login malsucedidas.

Implementação na Aplicação Cliente

Exemplo em Angular

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  token: string = '';
  title = 'consome-portal-app';

  async ngOnInit() {
    const token = await this.autenticate();

    if (token) {
      this.token = token;    
    }

    this.initializeEventListeners();

  }

  removeExistentsScripts(){
    let existingScript = document.getElementById("port-prest-external-integration");

    if (existingScript) {
      existingScript.remove(); // Remove o script caso já exista
    }
  }

  protected consultationRegister() {
    this.removeExistentsScripts();
    let scriptToken = document.createElement("script");
    scriptToken.setAttribute("src", "https://portal.totvs.com.br/totvs-hgp-portal-prestador/external-integration/consultation-register.js");
    scriptToken.setAttribute("type", "text/javascript");
    scriptToken.setAttribute("id", "port-prest-external-integration");
    scriptToken.setAttribute("token", `${this.token}`);
    scriptToken.setAttribute("target", "#divIframe");
    document.getElementsByTagName('body')[0]?.appendChild(scriptToken);
  }

  protected examRequest() {
    this.removeExistentsScripts();
    let scriptToken = document.createElement("script");
    scriptToken.setAttribute("src", "https://portal.totvs.com.br/totvs-hgp-portal-prestador/external-integration/exam-request.js");
    scriptToken.setAttribute("type", "text/javascript");
    scriptToken.setAttribute("id", "port-prest-external-integration");
    scriptToken.setAttribute("token", `${this.token}`);
    scriptToken.setAttribute("target", "#divIframe");
    document.getElementsByTagName('body')[0]?.appendChild(scriptToken);
  }

  private async autenticate() {
    const bodyRequest = JSON.stringify({
        "user": "daniel.jose",
        "password": "174b063a7d7e684004d94f4965b52ad9",
        "clinic": 10026,
        "cnpjClinic": "03.151.186/0001-78",
        "provider": 31921,
        "beneficiaryCard": "01200108959000048"
    });

    const options = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: bodyRequest
    };

    const result = await fetch('https://portal.totvs.com.br/totvs-hgp-haw-auth/api/external-authentication', options) ?? ""; 
    const { externalToken } = await result.json();
    return externalToken;
  }
  
  private initializeEventListeners(){
    window.addEventListener("message", (event) => {
      // Verifique a origem da mensagem para evitar problemas de segurança
      if (event.origin !== "https://portal.totvs.com.br") return;
  
      if (event.data.event === "savedConsultationRegister") {
          console.log("Registro de consulta: ", event.data);
          alert("O Registro de consulta foi salvo com sucesso!");
      }

      if (event.data.event === "examRequestFinish") {
          console.log("Solicitação de exame: ", event.data);
          alert("O Solicitação de exame foi salvo com sucesso!");
      }
    });
  }
}
<h1>
  <div id="divIframe" #divIframe>

  </div>

</h1>


Incorporando o Portal Prestador

Após obter o token de autenticação, você pode incorporar o Portal Prestador de duas maneiras:

1. Utilizando Script Iframe com JavaScript para acessar o registro de consulta

protected consultationRegister() {
    this.removeExistentsScripts();
    let scriptToken = document.createElement("script");
    scriptToken.setAttribute("src", "https://portal.totvs.com.br/totvs-hgp-portal-prestador/external-integration/consultation-register.js");
    scriptToken.setAttribute("type", "text/javascript");
    scriptToken.setAttribute("id", "port-prest-external-integration");
    scriptToken.setAttribute("token", `${this.token}`);
    scriptToken.setAttribute("target", "#divIframe");
    document.getElementsByTagName('body')[0]?.appendChild(scriptToken);
}	

Exemplo do iframe do registro de consulta:


2. Utilizando Script Iframe com JavaScript para acessar o Solicitação de exames

protected examRequest() {
    this.removeExistentsScripts();
    let scriptToken = document.createElement("script");
    scriptToken.setAttribute("src", "https://portal.totvs.com.br/totvs-hgp-portal-prestador/external-integration/exam-request.js");
    scriptToken.setAttribute("type", "text/javascript");
    scriptToken.setAttribute("id", "port-prest-external-integration");
    scriptToken.setAttribute("token", `${this.token}`);
    scriptToken.setAttribute("target", "#divIframe");
    document.getElementsByTagName('body')[0]?.appendChild(scriptToken);
}	 

Exemplo do iframe do solicitação de exames:

3. Requisitando a eligibilidade via cUrl

//O token a passar é a propriedade token de retorno da autenticação externa do portal prestador
curl --location 'https://portal.totvs.com.br/dts/datasul-rest/resources/prg/portprest/v1/elegibility' \
--header 'authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIwMjAwMTBhQUlXWVhaQ2ZUSjNDY21aWmNxVnFRMzMiLCJpYXQiOjE3NDM1MTE5OTQsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiNWFiN2ZkYTgtMDUzNy00YzRmLWE5OWEtN2I5NWYzYjA2YTI4IiwiZXhwIjoxNzQzNTEzNzk0LCJhdWQiOiJsb2NhbGhvc3QuODI4MCIsInNjb3BlIjpbIi9wb3J0cHJlc3QiXX0.UomeuerSlOou9gNz_9ZVhTFrmb96ZvTL1EKd4CejT_-r8sZhPLTW1vT2eN-XPZutgoKPlo4l_LeKytnJcuDTd7w48L2fJaNf_vXXdxS9hvwFjMqEmL_S_zhNIGg1y5Ikw9FPXG4nJO6SgMFtgTNhi7n6vtwaBbTDntH0MnoK6qLPkAhNeKMwnQ2PcphcQ7n9UJed9mdyzW1lS_KJuBzWDiPPSisQbgicN9VnMjKEwBe2Bk_nF-8KFQiLNAjRlF1bXXsdvzROQPKdyheDZkz3wtgX5E31W32khV0ffCdyuwBcCqADWa0zi2ZHIsSPp8BCVEOPZ6CPGgLtiUD4BQFZeQ' \
--header 'Content-Type: application/json' \
--header 'x-totvs-hgp-portal-prestador-clinic: 10026' \
--data '{
    "provider": 31921,
    "healthInsurerProvider": 120,
    "completeCardNumber": "01200108959000048"
}'
{
    "total": 1,
    "hasNext": false,
    "items": [
        {
            "code": "3040",
            "description": "609  - Periodo de movimentacao fechado, impossivel incluir/modificar movime"
        }
    ]
}


Considerações de Segurança

  1. Armazenamento seguro do token: O token JWT deve ser armazenado de forma segura no cliente, preferencialmente em memória ou em um armazenamento de sessão de curta duração.
  2. Não expor o token: Evite passar o token como parâmetro de URL em ambientes não seguros.
  3. Timeout de sessão: O token possui um tempo de expiração. Sua aplicação deve estar preparada para renovar o token quando necessário.
  4. Hash de senha: A senha deve sempre ser enviada em formato hash MD5, nunca em texto puro.

Solução de Problemas

Erro: "Clinica nao encontrada"

Erro: "Nao foram encontrados dados para a validaçãoo do usuário"

Erro: Token inválido ou expirado

Erro 401: Unauthorized