enc28J60 e Arduino (15)

by luca
14 comments

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…

 

Related Posts

14 comments

sergio 28 agosto 2013 - 16:04

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

Reply
luca 4 settembre 2013 - 13:38

Hi Sergio,

I’m working on an example about it… stay tuned 😉

Reply
Martin 4 settembre 2013 - 21:26

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.

Reply
CristianMoi 2 dicembre 2013 - 13:18

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…

Reply
luca 2 dicembre 2013 - 13:54

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.

Reply
Consumer48 30 marzo 2014 - 15:51

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!!

Reply
sarovin 17 giugno 2014 - 09:56

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?

Reply
luca 22 giugno 2014 - 12:26

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!

Reply
Paolo 19 gennaio 2015 - 15:28

Ciao Luca,
grazie per il bell’esempio. È applicabile anche per proteggere la pagina index.html di Arduino Yun?

Reply
luca 19 gennaio 2015 - 20:45

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

Reply
Paolo 20 gennaio 2015 - 08:18

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

Reply
Nenad 10 aprile 2016 - 22:35

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

Reply
luca 11 aprile 2016 - 09:27

ciao! no, l’esempio di questo tutorial non richiede la SD

Reply
Nenad 11 aprile 2016 - 18:50

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

Reply

Leave a Comment

uno × due =