Il tutorial di oggi nasce da una richiesta di Martin: realizzare uno sketch per accedere ad un’area protetta (con username e password) di un sito web.
Basic Authentication
Il metodo di autenticazione più semplice che il protocollo HTTP supporta è chiamato basic authentication.
Se proviamo ad accedere ad un’area sicura, il server risponderà alla nostra richiesta con il codice 401, indicando al browser la necessità di specificare nome utente e password validi. Normalmente in questo caso il browser mostrerà un messaggio chiedendoci di inserire i dati richiesti:
Nome utente e password vengono quindi uniti in un’unica stringa, separati da due punti (utente:password). La stringa viene quindi codificata in base64 ed inviata al server all’interno di un header HTTP:
Authorization: Basic stringa_base64
Se ad esempio il nostro nome utente è luca e la password è MyS3cr3t, possiamo utilizzare un convertitore online per trovare la codifica base64 da inserire nell’header:
Configurazione server
E’ necessario effettuare una configurazione lato server per attivare la basic authentication su una cartella del nostro sito. La maggior parte dei server web sono configurabili tramite files .htaccess salvati all’interno della cartella stessa.
Per prima cosa, dobbiamo preparare un file contenente gli utenti (e le relative password); questo file per convenzione si chiama .htpasswd. Utilizziamo uno strumento online per codificare i dati e inseriamo la stringa ottenuta all’interno del file .htpasswd; carichiamo infine questo file all’interno della cartella da proteggere:
Prepariamo ora il file .htaccess con il seguente contenuto:
AuthType Basic AuthName "Secure folder" AuthUserFile /htdocs/demo/secure/.htpasswd Require valid-user
Con AuthType indichiamo la modalità (“basic”) di autenticazione, mentre con AuthName possiamo specificare un nome per l’area protetta.
Dobbiamo quindi specificare la posizione del file .htpasswd, indicando il suo path assoluto. Per conoscere questo percorso possiamo sfruttare un semplice script php.
Infine possiamo indicare di accettare qualsiasi utente presente nel file (“valid-user”) o, in alternativa, indicare il nome degli utenti validi (Require user username).
Anche il file .htaccess va caricato nella cartella da proteggere:
Arduino
Lo sketch completo è disponibile nel repository GitHub.
Viene definita come costante la stringa (già codificata in base64) di autenticazione:
char authorization[] PROGMEM = "bHVjYTpNeVMzY3Izdb=="; |
La richiesta (GET) al server web contiene anche l’header Authorization:
Stash::prepare(PSTR("GET /demo/secure/ HTTP/1.1" "\r\n" "Host: $F" "\r\n" "Authorization: Basic $F" "\r\n" "\r\n"), website, authorization); |
Viene quindi controllato se la risposta del server contiene il valore 401 (che indica una richiesta di autenticazione, quindi il rifiuto delle credenziali) o 200 (ok):
if(strstr(reply, "HTTP/1.1 401") != 0) Serial.println("Authorization required :("); else if(strstr(reply, "HTTP/1.1 200") != 0) Serial.println("Access granted! :)"); |
Infine due screenshots dello sketch in azione…
Hello Luca,
congratulations for the site, I found a little time and has helped me a lot.
Please, I am trying to develop a project with arduino + NIC enc20j60 (the dx.com) and wish I could change the ip address and salver in eeprom, all via the web.
Something like this?
thank you
Hi Sergio,
I’m working on an example about it… stay tuned 😉
Hi Luca,
great tutorial. Thanks a lot especially for the part with arduino code. I will test it soon as can be really helpfull in the projects.
Ciao Luca, innazitutto compilemti per questo splendido sito, volevo porti una domanda ho un problema con una scheda comprata tempo fa su eBay pensado fosse originale invece quando mi è arrivata ho visto che così non era… si tratta di una Arduino Ethernet Shield V1.1 marchiata posteriormente con la sigla FLAMINGO EDA (2009)… ovviamente provandola con la libreria standard per la Ethernet Standard… facendo una ricerca su internet ho scoperto che la libreria si trova a questo link:
http://code.google.com/p/flamingoarduino/source/browse/trunk/hardware/libraries/Ethernet/?r=3
oppure quì (credo sia il produttore):
http://www.flamingoeda.com/2008/09/04/arduino-ethernet-%E7%BD%91%E7%BB%9C%E6%89%A9%E5%B1%95%E6%9D%BF/
quando provo le librerie pero pare che ci sia qualche problema… perchè usando i stessi file d’esempio riportati nella cartella… solo compilando il sorgente genera subito degli errori come se non riuscisse ad utilizzare i file presenti nella libreria… puoi darmi una mano? hai per caso delle librerie aggiornate per questo hardware? perchè presumo che questa libreria sia obsoleta e probabilmente mi da questo problema…
Ciao Cristian,
hai provato ad usare la libreria dei miei tutorial? Dovrebbe essere compatibile… la libreria che linki tu è molto vecchia, probabilmente non è compatibile con l’IDE 1.0.
Hey! Just wanted to give you a thumbs up, and say that your tutorials are some of the best ones out there! Great job, keep it up & many thanks!!
Salve,
sto iniziando a giocare con arduino ed ho appena acquistato la ENC28J60 ( deve ancora arrivare 😀 ). Quello che voglio provare a fare è controllare un relè collegato all’interruttore della caldaia. Naturalmente con un occhio alla sicurezza. Avevo pensato di creare un sito web e collegare arduino UNO ad esso. Ciò che vorrei capire è come poter cifrare i pacchetti tra arduino UNO e il sito web/Cloud. L’unica soluzione che mi viene in mente è quella di assegnare una sorta di ID ad arduino e registrarlo sul mio cloud, poi assegnare l’id ad un specifico utente del cloud e quindi abilitare solo esso ad inviare e ricevere dati da arduino. Anche se qualcuno riesca ad intercettare la chiave necessaria dovrebbe inviare i pacchetti dal cloud ( unico indirizzo abilitato ad impartire comandi ad arduino ), trovate pecche in questa implementazione?
Ciao
direi che è una buona soluzione, purtroppo Arduino non riesce a gestire SSL quindi i pacchetti viaggiano in chiaro ma se abiliti nel tuo sketch un solo IP sorgente (quello del tuo server web) a inviare i comandi dovresti essere abbastanza sicuro!
Ciao Luca,
grazie per il bell’esempio. È applicabile anche per proteggere la pagina index.html di Arduino Yun?
Ciao Paolo
la pagina dello Yun dovrebbe già chiederti una password per accedere e puoi attivare la sicurezza (con la stessa password) anche per tutti i servizi REST dello Yun nelle opzioni: http://arduino.cc/en/Guide/ArduinoYun#toc5
Ciao Luca,
grazie per la pronta risposta. Confermo che, attivando la password per i servizi REST, appare il prompt per username e password, che sono però root e la password di root. Non è una bellissima soluzione, anche se per il momento mi può bastare.
Saluti
Ciao Luca , sono nuovissimo nel mondo arduino. Se ho capito bene la autenticazione richiesta e fatta sulla SDWebServer. E possibile di farla senza uso di SD?
Grazie 1000
ciao! no, l’esempio di questo tutorial non richiede la SD
Ciao Luca, scusa per la mia ignoranza , ho letto che bisogna salvare file ” Dobbiamo quindi specificare la posizione del file .htpasswd,
e li non capisco cosa bisogna fare.
Grazie 1000