Workflow – Interfacciare un servizio HTTP con autenticazione tramite il blocchetto Custom Javascript Code

Estimated reading: 5 minutes 299 views

Creazione del server

Prendiamo come esempio un servizio PHP che verifica se un numero è positivo, restituendo true o false. Per aggiungere un livello di sicurezza, includiamo un’autenticazione tramite l’header HTTP Authorization.

L’utente dovrà inviare il nome utente e la password nel formato username:password, che il server verificherà. Per semplicità, utilizzeremo credenziali fisse, ad esempio user e password123.

				
					<?php // Funzione di autenticazione con username e password
function authenticate() {
    // Imposta username e password predefiniti
    $valid_username = "user";
    $valid_password = "password123";

    // Controlla se l'header Authorization è presente
    if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
        // Se non ci sono credenziali, invia una risposta di errore
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: Basic realm="Restricted Area"');
        echo json_encode(['error' => 'Authentication required']);
        exit();
    }

    // Confronta le credenziali fornite con quelle valide
    if ($_SERVER['PHP_AUTH_USER'] !== $valid_username || $_SERVER['PHP_AUTH_PW'] !== $valid_password) {
        // Se le credenziali non sono corrette, invia una risposta di errore
        header('HTTP/1.1 401 Unauthorized');
        echo json_encode(['error' =&gt; 'Invalid credentials']);
        exit();
    }
}

// Funzione per verificare se il numero è positivo
function isPositive($num) {
    return $num &gt; 0;
}

// Imposta l'intestazione per il formato JSON
header('Content-Type: application/json');

// Autenticazione dell'utente
authenticate();

// Verifica se il parametro "number" è passato nella query string o nel body
if (isset($_GET['number'])) {
    $number = $_GET['number']; // Ottieni il numero dalla query string
} elseif (isset($_POST['number'])) {
    $number = $_POST['number']; // Ottieni il numero dal body della richiesta
} else {
    // Se il parametro "number" non è presente, restituisci un errore 400 (Bad Request)
    http_response_code(400); // Imposta il codice di stato HTTP 400
    echo json_encode(['error' =&gt; 'Missing required parameter: number']);
    exit();
}

// Restituisci la risposta in formato JSON
echo json_encode(['isPositive' =&gt; isPositive($number)]);
?&gt;

				
			

Come testare il servizio

Accesso tramite GET

Puoi fare una richiesta al tuo server usando la query string. Ad esempio, se il tuo file PHP si trova su http://<your_host>/isPositive.php, puoi fare una richiesta come questa:

				
					curl -u user:password123 "http://<your_host>/isPositive.php?number=5"</your_host>
				
			

Risultato:

				
					{"isPositive":true}
				
			

Accesso tramite POST

Se preferisci usare una richiesta POST, puoi inviare un JSON con il parametro number nel corpo della richiesta. Ecco un esempio usando curl:

				
					curl -u user:password123 -X POST -d "number=-5" "http://<your_host>/isPositive.php"</your_host>
				
			

Risultato:

				
					{"isPositive":false}
				
			

Test del servizio con curl (da terminale)

GET con credenziali valide

				
					curl -i -u user:password123 "http://<your_host>/isPositive.php?number=5"
HTTP/1.1 200 OK
date: Fri, 03 Jan 2025 09:28:40 GMT
x-powered-by: PHP/7.3.20
transfer-encoding: chunked
content-type: application/json
content-security-policy: upgrade-insecure-requests ; base-uri 'self'; default-src 'self' *.fontawesome.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.fontawesome.com data:; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src 'self' 'unsafe-inline' data: fonts.gstatic.com *.fontawesome.com; img-src 'self' 'unsafe-inline' data:; media-src 'self' data:; connect-src 'self' *.fontawesome.com; object-src 'none'; frame-ancestors 'self'; frame-src *;
x-content-type-options: nosniff

{"isPositive":true}
</your_host>
				
			

GET con credenziali errate

				
					curl -i -u user:wrongpassword "http://<your_host>/isPositive.php?number=5"
HTTP/1.1 401 Unauthorized
date: Fri, 03 Jan 2025 09:30:49 GMT
x-powered-by: PHP/7.3.20
transfer-encoding: chunked
content-type: application/json
content-security-policy: upgrade-insecure-requests ; base-uri 'self'; default-src 'self' *.fontawesome.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.fontawesome.com data:; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src 'self' 'unsafe-inline' data: fonts.gstatic.com *.fontawesome.com; img-src 'self' 'unsafe-inline' data:; media-src 'self' data:; connect-src 'self' *.fontawesome.com; object-src 'none'; frame-ancestors 'self'; frame-src *;
x-content-type-options: nosniff

{"error":"Invalid credentials"}
</your_host>
				
			

GET senza credenziali

				
					curl -i "http://<your_host>/isPositive.php?number=5"
HTTP/1.1 401 Unauthorized
date: Fri, 03 Jan 2025 09:31:44 GMT
x-powered-by: PHP/7.3.20
www-authenticate: Basic realm="Restricted Area"
transfer-encoding: chunked
content-type: application/json
content-security-policy: upgrade-insecure-requests ; base-uri 'self'; default-src 'self' *.fontawesome.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.fontawesome.com data:; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src 'self' 'unsafe-inline' data: fonts.gstatic.com *.fontawesome.com; img-src 'self' 'unsafe-inline' data:; media-src 'self' data:; connect-src 'self' *.fontawesome.com; object-src 'none'; frame-ancestors 'self'; frame-src *;
x-content-type-options: nosniff

{"error":"Authentication required"}
</your_host>
				
			

Creazione del workflow

Vogliamo che, una volta attivato da una chiamata, il workflow telefonico:

  • imposti la variabile NUMBER con un valore positivo o negativo.
  • interroghi il servizio HTTP e, in base alla risposta:
    • se l’esito è HTTP 200, il chiamante sentirà:
      • “1” se NUMBER è positivo.
      • “0” se NUMBER è negativo.
    • se la richiesta fallisce, il chiamante sentirà i digit corrispondenti al codice di errore HTTP.

Il workflow si sviluppa quindi nel modo seguente:

Esaminando i singoli blocchetti, troviamo che:

Evidenziamo il codice JavaScript specificato nell’impostazione contrassegnata dal riquadro rosso in figura.

				
					// Inizializzazione variabili per accesso a classi java
var StringBuffer = Java.type('java.lang.StringBuffer');
var URL = Java.type('java.net.URL');
var HttpURLConnection = Java.type('java.net.HttpURLConnection');
var Base64 = Java.type('java.util.Base64');
var BufferedReader = Java.type('java.io.BufferedReader');
var InputStreamReader = Java.type('java.io.InputStreamReader');

// Workflow: array che contiene il risultato dello script, verrà passato alle variabili di mappa definite nel blocchetto
var result;

// URL dell'API
var url = "http://127.0.0.1/isPositive.php?number=" + NUMBER;

// Autenticazione di base
var username = "user";
var password = "password123";
var auth = username + ":" + password;
var encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes('utf-8'));

// Creazione della connessione HTTP
var obj = new URL(url);
var con = obj.openConnection();
con.setRequestMethod("GET");

// Aggiunta dell'header di autenticazione
con.setRequestProperty("Authorization", "Basic " + encodedAuth);

// Log della richiesta
print("Invio della richiesta HTTP:");
print("URL: " + url);
print("Metodo: " + con.getRequestMethod());
print("Intestazioni di Autenticazione: " + "Basic " + encodedAuth);

// Ottieni la risposta
var responseCode = con.getResponseCode();
print("Risposta HTTP Code: " + responseCode);

if (responseCode === HttpURLConnection.HTTP_OK) {
    // Lettura della risposta JSON
    var inStream = new BufferedReader(new InputStreamReader(con.getInputStream()));
    var inputLine;
    var response = new StringBuffer();

    while ((inputLine = inStream.readLine()) !== null) {
        response.append(inputLine);
    }
    inStream.close();

    // Stampa della risposta JSON
    var responseJson = response.toString();
    print("Risposta JSON: " + responseJson);

    // Estrazione del valore del campo 'isPositive' dal JSON
    var jsonObj = JSON.parse(responseJson);
    var isPositive = jsonObj.isPositive;

    // Stampa il valore del campo 'isPositive'
    print("Valore di isPositive: " + isPositive);
    
    result = [responseCode, isPositive];
} else {
    print("Errore nella richiesta");
    result = [responseCode];
}


print("Workflow result: " + result);

				
			
Condividi documento

Workflow – Interfacciare un servizio HTTP con autenticazione tramite il blocchetto Custom Javascript Code

Oppure copia il link

Contenuti

Prenota la tua demo!

Compila il form

Prenota la tua demo!

Compila il form

Prenota la tua demo!​

Compila il form

Subscribe

×
Cancel