Como criptografar os parâmetros passados para uma URL?

Visão Geral

As vezes queremos enviar o link de uma tela desenvolvida no Latromi para alguém, de forma que a pessoa que receba este link possa simplesmente clicar e consumir o recurso, sem que seja necessário (ou possível) informar qualquer parâmetro para filtrar os dados.

Para fazer isso usando o Latromi, será necessário a combinação de duas técnicas:

  • Captura de parâmetros de URL
  • Criptografia da URL

A seguir, vamos aprender a usar essas duas técnicas.

Captura de parâmetros de URL

Nos Formulários e Consultas do Latromi, é possível capturar qualquer parâmetro de URL e usá-los nos Procedimentos, Comandos SQL e na passagem de parâmetro.

Ao contrário de quando se utiliza um elemento pré-definido, que pode ser selecionado pelo usuário, como um Campos ou Parâmetros, ao utilizar um Parâmetro de URL ele precisa ser digitado manualmente.

Vamos usar como exemplo a seguinte URL:

https:// latromi.minha-empresa.com.br/web/DynamicForm.aspx?MenuId=123&Numero_NF=999

ou o mesmo endereço, mas com um Caminho amigável para URL:

https:// latromi.minha-empresa.com.br/web/ConsultaNF/?Numero_NF=999

Nosso objeto será capturar o parâmetro de URL Numero_NF, e usá-lo em Comandos SQL ou passagem de parâmetros.

Comando SQL

Para utilizar o parâmetro de URL em um Comando SQL, basta usar o formato já utilizado nos Parâmetros, Campos e etc, usando o prefixo “URL”:

SELECT 
    dtemissao,
    valortotal,
    idcliente
FROM notasfiscais
WHERE numero = {?URL Numero_NF}

Passagem de Parâmetros

Para usar a URL como valor na passagem de parâmetros ou na ação Popular Campos e Variáveis, também vamos usar o formato já utilizado nos Parâmetros, Campos e etc, usando o prefixo “URL”:

URL.Numero_NF

Criptografia da URL

No contexto apresentado neste exemplo, a criptografia da URL é um detalhe muito importante, para impedir que o usuário altere o valor dos parâmetros para tentar acessar outros dados, diferentes daqueles especificados na URL.

URL Fixa

Se você quer criptografar uma URL com parâmetros fixos, que não vão ser alterados com frequência, você pode fazer através dessa página: Criptografia de URL | LATROMI

Nota: Se o endereço do seu site ainda não estiver usando HTTPS, acesse este mesmo endereço usando o protocolo HTTP.

image

No resultado, você tem o endereço da URL criptografado. Este endereço pode ser acessado como se fosse o endereço original, com a segurança de que os parâmetros não estão expostos ao usuário.

URL Dinâmica

Se você precisa gerar uma URL dinâmica em um processo automatizado, será necessário usar a Web API de Criptografia de URL, disponível em qualquer instância do Latromi, no endereço relativo:

Services/CryptoProvider.svc/rest/EncryptUrl

A seguir vamos descobrir como consumir essa Web API via JavaScript e C#.

Usando JavaScript

A função abaixo faz a criptografia da URL consumindo a Web API e devolve o resultado em um callback:

function encryptUrl(url, callback) {
    var latromiBaseURL = "https://latromi.minha-empresa.com.br/web"
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4) {
            if (this.status == 200) {
                var result = JSON.parse(xhttp.responseText);
    
                // Dispara erro
                if (result.status !== "OK")
                    throw new Error(result.message);
    
                callback(result);
            }
            else {
                // Dispara erro
                throw new Error(result.statusText);
            }
        }
    };
    
    xhttp.open("POST", latromiBaseURL + "Services/CryptoProvider.svc/rest/EncryptUrl");
    xhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    xhttp.send(JSON.stringify({ url: url }));
}

Se essa você vai chamar essa função de dentro do Latromi, é possível implementar algumas melhorias.

Usar o endereço relativo da Web API. Neste caso a variável latromiBaseURL não seria necessária:

 xhttp.open("POST", "Services/CryptoProvider.svc/rest/EncryptUrl");

Substituir os disparos de erros por uma mensagens do Latromi:

if (result.status !== "OK")
    ShowMessage(result.message, "ERROR");

O código abaixo pode ser utilizado na ação Executar Código JavaScript dos Procedimentos. Neste exemplo, txtURL é o nome do campo que tem o endereço que será criptografado, e txtResult é o nome do campo onde a URL criptografada será mostrada:

var myForm = latromi.formManager.getFormInstance();
encryptUrl(myForm.getFieldValue('txtURL'), function (result) {
    myForm.setFieldValue('txtResult', result.absoluteUrl); // ou .relativeUrl
});

Usando C#

O código C# que vamos apresentar aqui é voltado para o uso dentro dos Formulários Dinâmicos.

Seguindo a mesma estrutura do exemplo em JavaScript, txtURL é o nome do campo que tem o endereço que será criptografado, e txtResult é o nome do campo onde a URL criptografada será mostrada:

// Adiciona referente de System.Web.Extensions para deserializar o resultado
var assembly = LoadAssembly("System.Web.Extensions.dll");
dynamic serializer = assembly.CreateInstance("System.Web.Script.Serialization.JavaScriptSerializer");

// Endereço que será criptografado
var url = (string)Fields["txtURL"].Value;

// Pega o endereço base do LATROMI
var latromiBaseURL = Environment.BaseUrl;

// Monta a url completa da Web API
var uri = new System.Uri(latromiBaseURL + "/Services/CryptoProvider.svc/rest/EncryptUrl");

// Inicia a requisição
var request = (System.Net.WebRequest)System.Net.WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";

// Adiciona na requisição o endereço que saerá criptografado
var requestData = Encoding.ASCII.GetBytes(serializer.Serialize(new { url = url }));
using (var stream = request.GetRequestStream())
{
    stream.Write(requestData, 0, requestData.Length);
}

// Consome a Web API
string resultJson = null;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new System.IO.StreamReader(stream))
{
    // Faz a leitura do retorno
    resultJson = reader.ReadToEnd();
}

// Deserializa o resultado
var result = serializer.Deserialize<dynamic>(resultJson);

// Se o status for "OK", devolve a URL criptografada.
if (result["status"] == "OK")
{
    Fields["txtResult"].Value = result["absoluteUrl"];
}