No Protheus, não há suporte nativo para autenticação digest em requisições REST via ADVPL; apenas BASIC ou Token (JWT) são suportados.
Para usar digest, é necessário montar manualmente o cabeçalho de autenticação, aplicando algoritmos de criptografia e codificando em Base64, conforme a documentação da API destino.
Tempo aproximado para leitura:00:01:45 min
Dúvida
Como realizar a autenticação do tipo digest em comunicações REST/JSON via ADVPL?
Ambiente
Cross Segmento - TOTVS Backoffice (Linha Protheus) - ADVPL - A partir da versão 12.23.10
Solução
Atualmente, não há uma função, classe ou método nativo homologado no Protheus para realizar a autenticação do tipo DIGEST de forma automática em requisições REST. Para integrações REST, as opções suportadas nativamente pelo framework são a autenticação BASIC ou via Token (JWT).
Caso seja mandatório o uso da autenticação do tipo digest no endpoint de destino, será necessário desenvolver a montagem do cabeçalho de autenticação manualmente via código ADVPL.
A autenticação digest normalmente exige o envio de informações como nonce, timestamp e senha, que são submetidas a um algoritmo de criptografia (como SHA) e posteriormente convertidas para Base64.
É necessário avaliar a documentação da API terceira (sistema destino) para confirmar quais informações são exigidas no payload e qual o algoritmo de criptografia adotado pelo servidor.
Segue um exemplo utilizando a FWRETSrest em que, caso o destino exija a criptografia SHA256, a lógica estrutural da string no ADVPL seguiria o formato:
#INCLUDE "PROTHEUS.CH"
#INCLUDE "RESTFUL.CH"
User Function TstDgstR()
Local oRest := FWRest():New()
Local aHeader := {}
Local cUrl := "https://api.exemplo.com.br/v1/endpoint" //informar sua API de exemplo
Local cUser := "usuario_api"
Local cPass := "senha_api"
Local cNonce := "nonce_fornecido_pelo_servidor"
Local cStringAuth := ""
Local cDigestHash := ""
Local cResponse := ""
cStringAuth := cUser + cPass + cNonce
cDigestHash := Encode64( SHA256( cStringAuth ) );/<------aqui ocorre a uitilização da criptografia
aAdd( aHeader, "Authorization: Digest " + cDigestHash )// Temos a construção de header de exemplo
aAdd( aHeader, "Content-Type: application/json" )
oRest:SetPath( cUrl )
If oRest:Get( aHeader )
cResponse := oRest:GetResult()
ConOut("Requisição realizada com sucesso: " + cResponse)
Else
ConOut("Erro na requisição REST. Detalhe: " + oRest:GetLastError())
EndIf
Return .T.Para viabilizar essa implementação customizada, utilize as funções de criptografia nativas disponibilizadas pela linguagem ADVPL para tratar a string antes do envio da requisição.
Saiba Mais
SHA256
Criptografia
FWRest
0 Comentários