Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Saúde Planos

Linha de Produto:

  -

Segmento:

Saude 

Módulo:PLANO DE SAUDE SIGAPLS
Função:Não se aplica
Ticket:7361972
Requisito/Story/Issue (informe o requisito relacionado) :DSAUBE-10407


02. 
SITUAÇÃO/REQUISITO

Implementada melhoria que permite o processo de validação do Token de Cartão virtual gerado por aplicativo.

O Token é uma senha numérica de 6 a 8 dígitos gerada por Aplicativo, que é informada pelo beneficiário no momento do atendimento e validada pelo sistema de Gestão ( PLS ), servindo como um segundo fator de autenticação, assegurando que quem está sendo atendido é mesmo o beneficiário portador da carteirinha informada.


03. SOLUÇÃO

Para que a validação seja possível, tanto o Aplicativo quanto o PLS devem ser capazes de gerar um mesmo Token para um mesmo usuário em um mesmo intervalo de tempo. Para isso, é necessário o compartilhamento, entre Aplicativo e PLS, de uma Chave (Seed) e alguns "parâmetros de alinhamento" para geração desse Token. Nesta implementação, esse compartilhamento é feito no momento do login.

04. DEMAIS INFORMAÇÕES

Criação de campo e do valid de alguns existentes.

Código do Pacote: 008174.

Criação na tabela SX3:

X3_CAMPOX3_TAMANHOX3_PICTUREX3_TITULOX3_CONTEXTX3_VISUAL
BA1_TKSEED128@!Token Seed1 - Real1 - Alterar


Alteração da tabela BE1 E BE4:

X3_CAMPOX3_VALID
BE1_TOKEDIIf(Inclui, If(Empty(M->BE1_USUARI),.T.,PLSA090DAT("2")),.T.)
X3_CAMPOX3_VALID
BE4_TOKEDIIf(Inclui, If(Empty(M->BE4_USUARI),.T.,PLBE4USUAR()),.T.)


Foram criados alguns parâmetros na X6.

X6_VARX6_TIPOX6_DESCRICX6_DESCRIC 1X6_CONTEUD
MV_PLSTKSTNTipo de Seed Gerado1=Text;2=Base64;3=Hex1
MV_PLSTKSHNDefine o tamanho do Seed gerado.3=SHA1;5=SHA256;7=SHA5125
MV_PLSTKDGNNúmero Dígitos Token6, 7 ou 86
MV_PLSTKTSNToken Time StepValor de tempo em segundos1800

O processo completo de Geração e Validação do Token , pode ser visualizado a seguir.



Dessa forma, esta implementação abrange as seguintes funções e processos:

1 - Função PLSTKSEEDG que gera Chave (seed) compartilhada entre PLS e Aplicativo para que ambos gerem o mesmo Token para um mesmo intervalo de tempo. O seed gerado é gravado no registro do usuário (BA1_TKSEED):

Sintaxe

PLSTKSEEDG(cMatric, lAtualiza)

Parâmetros

NomeTipoDescriçãoObrigatório
cMatriccaractereMatrícula do Beneficiáriox
lAtualizabooleanoAtualiza BA1_TKSEEDx

                                       

Retorno

aRet[1]                  boolean                 Status de Retorno

aRet[2]                  caractere              Seed Gerado


Parâmetros de Sistema envolvidos

X6_VARX6_TIPOX6_DESCRICX6_DESCRIC 1X6_CONTEUD
MV_PLSTKSTNTipo de Seed Gerado1=Text;2=Base64;3=Hex1
MV_PLSTKSHNDefine o tamanho do Seed gerado.3=SHA1;5=SHA256;7=SHA5125


Pontos de Entrada

PTKSEEDG

Descrição: Retorna Seed customizado para ser utilizado na Geração do Token. O mesmo é gravado no registro do usuário (BA1_TKSEED):

Parâmetros:

NomeTipoDescriçãoObrigatório
cMatriccaractereMatrícula do Beneficiáriox


2 - Inclusão, no método de criação e login de usuário da api de integração PLS x Aplicativo, de parâmetros de alinhamento para gereção do Token. São eles: Seed, Tipo do Seed, Tipo do Algoritmo a ser utilizado na geração do Token, Número de Digitos do Token e Intervalo de validade do Token em segundos (30min = 1800seg, conforme Manual):

Foram incluidos os seguintes Objetos Custom, dentro dos Objetos Beneficiários retornados pelo método de login da api mobile padrão:

  1. Seed para Geração do Token:

Chave: "Seed"
Valor: Seed do Beneficiário, gerado pela função PLSTKSEEDG.

  1. Algoritmo a ser utilizado na geração do Token:

Chave: "hash"

Valor: "SHA-1", "SHA-256" ou "SHA-512", dependendo do parâmetro MV_PLSTKSH

  1. Tipo do Seed para Geração do Token:

Chave: "seedType"

Valor: "Text", "Base64" ou "Hex", dependendo do parâmetro MV_PLSTKST

  1. Número de Dígitos dos Tokens a serem gerados:

Chave: "digits"

Valor: 6, 7 ou 8, dependendo do parâmetro MV_PLSTKDG

  1. Intervalo de validade do Token

Chave: "timeStep"

Valor: Período de Tempo, em segundos, dentro do qual um Token é válido. Depende do parâmetro MV_PLSTKTS.

Exemplo de Objeto Custom gerado para um Beneficiário:

...

"beneficiarios": [

                {

                               "nome": "EDSON ARANTES DO NASCIMENTO",

                               "nomeTitular": "EDSON ARANTES DO NASCIMENTO",

                               "matricula": "00010001000002006",

                               ...

                               "custom": [

                                               {

                                                               "valor": "uAbs7YWLcIigsXdqiCzM",

                                                               "chave": "seed"

                                               },

                                               {

                                                               "valor": "SHA-1",

                                                               "chave": "hash"

                                               },

                                               {

                                                               "valor": "Text",

                                                               "chave": "seedType"

                                               },

                                              {

                                                               "valor": 6,

                                                               "chave": "digits"

                                               },

                                               {

                                                               "valor": 1800,

                                                               "chave": "timeStep"

                                               }

                               ],

                               ...

],

...


Parâmetros de Sistema envolvidos

X6_VARX6_TIPOX6_DESCRICX6_DESCRIC 1X6_CONTEUD
MV_PLSTKSTNTipo de Seed Gerado1=Text;2=Base64;3=Hex1
MV_PLSTKSHNDefine o tamanho do Seed gerado.3=SHA1;5=SHA256;7=SHA5125
MV_PLSTKDGNNúmero Dígitos Token6, 7 ou 86
MV_PLSTKTSNToken Time StepValor de tempo em segundos1800


Importante!!!

APIs customizadas para integração com APP

Caso a operadora não utilize a API de integração mobile padrão, ela deverá incluir, na API customizada, todas as informações necessárias para alinhamento sobre a geração do Token. Dentre essas informações, é obrigatória a geração do Seed do Token utilizando-se a função PLSTKSEEDG descrita acima. Somente dessa forma será possível utilizar o processo padrão de validação do Token nos processos de Autorização.

 


3 - Funções de Geração e Validação do Token utilizando algoritmo TOTP (RFC6238 - https://tools.ietf.org/html/rfc6238 ). Essas funções são responsáveis por gerar, no PLS, o mesmo Token do Aplicativo para um determinado intervalo de tempo, de acordo com os parâmetros de alinhamento, e compará-lo com o Token informado no atendimento:

Função

PLSTOTPGEN

Descrição

Gera um Token genérico, baseado no algoritmo TOTP, de acordo com os parâmetros da função.

Sintaxe

PLSTOTPGEN(cK, nX, hashType, nKType, nXType, nDigits, cTTest)

Parâmetros

NomeTipoDescriçãoObrigatório
cKcaractereSeedx
nXinteger Time Stepx
hashTypeinteger

Função hash utilizada:

(3=SHA-1; 5=SHA-256; 7=SHA-512)

x
nKTypeinteger

Tipo do Seed:

(1=Text; 2=Base64; 3=Hex)

x
nXTypeinteger

Tipo do Input:

(1=Text; 2=Base64; 3=Hex)

x
nDigits integerNúmero de Dígitos x
cTTest caractere

Input específico que pode ser utilizado para gerar o TOTP para um intervalo de tempo (timestamp) específico

x

                                                

Retorno

cRet                       caractere              Token gerado

-----

Função

PLSTOKGENE

Descrição

Gera um Token específico, baseado no algoritmo TOTP, para um beneficiário específico de acordo com a hora atual do servidor.

Sintaxe

PLSTOKGENE(cMatric)

Parâmetros

NomeTipoDescriçãoObrigatório
cMatriccaractereMatrícula do Beneficiáriox


Retorno

aRet[1]                  boolean                 Status de Retorno da Função

aRet[2]                  caractere              Token Gerado

-----

Função

PLSUTOKVLD

Descrição

Valida se um Token está correto para um Beneficiário específico em um intervalo de tempo específico.

Sintaxe

PLSUTOKVLD(cMatric, cToken)

Parâmetros

NomeTipoDescriçãoObrigatório
cMatriccaractereMatrícula do Beneficiáriox
cTokencaractereToken a ser validadox

                                                                                   

                                                               

                                                                          

Retorno

aRet[1]                  boolean                 Se Token é valido ou não

aRet[2]                  caractere              Token Correto



Importante!!

Existem alguns sites na internet que geram Tokens utilizando o algoritmo TOTP. Eles foram utilizados para validar a implentação da função de geração do Token (PLSTOTPGEN) implementada. Caso haja interesse de conferência, é importante ressaltar que esses sites, normalmente, utilizam o Seed em formato Base32. Então, para isso, como o Seed implementado no PLS pode possuir apenas os formatos Texto, Base64 e Hexadecimal, é necessária a transformação em Base32 antes de inputá-lo no algoritmo no site de conferência.

Exemplo para testes.:

  1. Seed Gerado para o Beneficiário 00010001000002006 = xOS8KQ9WPsTU23PjPbJD em formato texto, no momento do login;
  2. Utilizar site https://emn178.github.io/online-tools/base32_encode.html para transformar text em Base32. Resultado: PBHVGOCLKE4VOUDTKRKTEM2QNJIGESSE

       3. Utilizar Base32 como input do site https://totp.danhersam.com/ para geração do Token TOTP. Resultado: 298014

       4. Verificar durante atendimento que Token gerado no sistema é o mesmo que o gerado pelo site de verificação:


4 - Inclusão de novo Motivo de Críticas do Sistema específico para a validação do Token;

Para funcionamento correto da melhoria, a seguinte Crítica de Sistema deve ser cadastrada:

Proprietário:Código Glosa:Descrição:Tipo: Ativa?: Justif.Obr.: Analisar: Glosa TISS: Desc. Glosa: 
BCT_PROPRI = 5BCT_CODGLO = 87BCT_DESCRI = Token InválidoBCT_TIPO = 1BCT_ATIVA = 1BCT_RESOBR = 0BCT_LOCANA = 1BCT_GLTISS = 1011BCT_DESTIS = IDENTIFICACAO DO BENEFICIARIO NAO CONSISTENTE

Obs.: Nova glosa disponível no arquivo bct-motivo_de_criticas.csv, para carregamento automático.

 

5 - Processo de validação do Token dentro do Atendimento de Autorização SADT;

Iniciar um Atendimento do Tipo Autorização SADT e preencher a Matrícula do Beneficiário.

Informar Token.

Caso não seja válido, o sistema exibirá críticas.


Caso o parâmetro MV_PLSCABC esteja ativado, o sistema permitirá a continuação do Atendiemento com status não autorizado e gravará as críticas. Caso contrário, o atendimento não poderá ser concluído.

 

6 - Processo de validação do Token dentro do Atendimento de Solicitação de Internação;

Iniciar um Atendimento do Tipo Solicitação de Internação e preencher a Matrícula do Beneficiário.

Informar Token.

Caso não seja válido, o sistema exibirá críticas.

Caso o parâmetro MV_PLSCABC esteja ativado, o sistema permitirá a continuação do Atendiemento com status não autorizado e gravará as críticas. Caso contrário, o atendimento não poderá ser concluído.

 

7 - Processo de validação do Token no PTU Online

Iniciar um Pedido de Autorização, via PTU Online, incluindo o Token de Usuário, conforme exemplo a seguir.

<v80:pedidoAutorizacaoWS>

                ...

                <v80:pedidoAutorizacao>

                               <v80:identificacaoBeneficiario>

                                               ...

                                               <v80:codigoIdentificacao>0001000002057</v80:codigoIdentificacao>

                                               ...

                                </v80:identificacaoBeneficiario>

                               ...

                               <v80:token>301039</v80:token>

                               <v80:blocoServicoPedido>

                                               <v80:pedidoServico>

                                                               <v80:servico>

                                                                              <v80:sqitem>1</v80:sqitem>

                                                                              <v80:tipoTabela>22</v80:tipoTabela>

                                                                              <v80:codigoServico>10101012</v80:codigoServico>

                                                               </v80:servico>

                                                               <v80:quantidadeServico>1</v80:quantidadeServico>

                                                               <v80:tpAnexo>9</v80:tpAnexo>

                                               </v80:pedidoServico>

                                               <v80:pedidoServico>

                                                               <v80:servico>

                                                                              <v80:sqitem>1</v80:sqitem>

                                                                              <v80:tipoTabela>22</v80:tipoTabela>

                                                                              <v80:codigoServico>40301060</v80:codigoServico>

                                                               </v80:servico>

                                                               <v80:quantidadeServico>1</v80:quantidadeServico>

                                                               <v80:tpAnexo>9</v80:tpAnexo>

                                               </v80:pedidoServico>

                               </v80:blocoServicoPedido>

                               ...

                </v80:pedidoAutorizacao>

</v80:pedidoAutorizacaoWS>


Caso o Token informado não seja válido, o sistema responde a solicitação com a crítica correspondente, e grava o atendimento com os procedimentos negados e respectivas críticas.

Resposta:

<respostaPedidoAutorizacaoWS xmlns="http://ptu.coop.br/schemas/V80_00">

...

<respostaPedidoAutorizacao>

...

<blocoServicoRespostaPedido>

                <respostaPedidoServico>

                               <servico>

                                               <sqitem>1</sqitem>

                                               <tipoTabela>22</tipoTabela>

                                               <codigoServico>10101012</codigoServico>

                                               <descricaoServico>CONSULTA EM CONS...</descricaoServico>

                               </servico>

                               <mensagensEspecificas>

                                               <mensagem>2073</mensagem>

                                               <descricaoMensagemEspec>Token Invalido.</descricaoMensagemEspec>

                               </mensagensEspecificas>

                               <indicaAutorizacao>1</indicaAutorizacao>

                </respostaPedidoServico>

                <respostaPedidoServico>

                               <servico>

                                               <sqitem>1</sqitem>

                                               <tipoTabela>22</tipoTabela>

                                               <codigoServico>40301060</codigoServico>

                                               <descricaoServico>ACIDO ASCORBICO VITAMINA C - PESQ...</descricaoServico>

                               </servico>

                               <mensagensEspecificas>

                                               <mensagem>2073</mensagem>

                                               <descricaoMensagemEspec>Token Invalido.</descricaoMensagemEspec>

                               </mensagensEspecificas>

                               <indicaAutorizacao>1</indicaAutorizacao>

                </respostaPedidoServico>

</blocoServicoRespostaPedido>


No sistema:

 

8 - Processo de validação do Token no TissOnline

Iniciar uma Solicitação SADT, via Tiss Online, incluindo o Token de Usuário no campo "codAutorizacao", conforme exemplo a seguir.


<ans:solicitacaoProcedimentoWS ... >

<ans:cabecalho>

                <ans:identificacaoTransacao>

                               <ans:tipoTransacao>SOLICITACAO_PROCEDIMENTOS</ans:tipoTransacao

                               ...

                </ans:identificacaoTransacao>

                <ans:Padrao>3.05.00</ans:Padrao>

                ...

</ans:cabecalho>

<ans:solicitacaoProcedimento>

                <ans:solicitacaoSP-SADT>

                               ...

                               <ans:codValidacao>123456</ans:codValidacao>

                               ...

                               <ans:dadosBeneficiario>

                                               <ans:numeroCarteira>00010001000002057</ans:numeroCarteira>

                                               ...

                               </ans:dadosBeneficiario>

                               <ans:procedimentosSolicitados>

                                               <ans:procedimento>

                                                               <ans:codigoTabela>22</ans:codigoTabela>

                                                               <ans:codigoProcedimento>40301060</ans:codigoProcedimento>

                                                               <ans:descricaoProcedimento>ACIDO...</ans:descricaoProcedimento>

                                               </ans:procedimento>

                                               <ans:quantidadeSolicitada>1</ans:quantidadeSolicitada>

                               </ans:procedimentosSolicitados>

                </ans:solicitacaoSP-SADT>

</ans:solicitacaoProcedimento>

...

</ans:solicitacaoProcedimentoWS>


Caso o Token informado não seja válido, o sistema responde a solicitação com a crítica correspondente, e grava o atendimento com os procedimentos negados e respectivas críticas.

Resposta:


<ans:autorizacaoProcedimentoWS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">

<ans:cabecalho>

                <ans:identificacaoTransacao>

                               <ans:tipoTransacao>RESPOSTA_SOLICITACAO</ans:tipoTransacao>

                               ...

                </ans:identificacaoTransacao>

                ...

<ans:cabecalho>

<ans:autorizacaoProcedimento>

                <ans:autorizacaoServico>

                               <ans:dadosAutorizacao>

                                               ...

                                               <ans:numeroGuiaOperadora>000120201000000076</ans:num...>

                               </ans:dadosAutorizacao>

                               <ans:dadosBeneficiario>

                                               <ans:numeroCarteira>00010001000002057</ans:numeroCarteira>

                                               ...

                               </ans:dadosBeneficiario>

                               <ans:servicosAutorizados>

                                               <ans:servicoAutorizado>

                                               <ans:sequencialItem>0001</ans:sequencialItem>

                                               <ans:procedimento>

                                                               <ans:codigoTabela>22</ans:codigoTabela>

                                                               <ans:codigoProcedimento>40301060</ans:codigoProcedimento>

                                                               <ans:descricaoProcedimento>ACIDO AS...</ans:descricaoProced...>

                                               </ans:procedimento>

                                               <ans:quantidadeSolicitada>1</ans:quantidadeSolicitada>

                                               <ans:quantidadeAutorizada>0</ans:quantidadeAutorizada>

                                               <ans:motivosNegativa>

                                                               <ans:motivoNegativa>

                                                                              <ans:codigoGlosa>1011</ans:codigoGlosa>

                                                                              <ans:descricaoGlosa>IDENTIFICACAO DO BENEFICIARIO NAO CONSISTENTE</ans:descricaoGlosa>

                                                               </ans:motivoNegativa>

                                               </ans:motivosNegativa>

                </ans:servicoAutorizado>

No sistema:


X6_VARX6_TIPOX6_DESCRICX6_DESCRIC 1X6_CONTEUD
MV_PLSTKSTNTipo de Seed Gerado1=Text;2=Base64;3=Hex1
MV_PLSTKSHNDefine o tamanho do Seed gerado.3=SHA1;5=SHA256;7=SHA5125
MV_PLSTKDGNNúmero Dígitos Token6, 7 ou 86
MV_PLSTKTSNToken Time StepValor de tempo em segundos1800


Importante!!

Para funcionamento correto, deve-se, também, atualizar o binário do appserver com a versão 7.00.191205P-20201210

05. ASSUNTOS RELACIONADOS

        <Não se aplica>