Bonjour,
Je pense que le plus simple est d'utiliser ce que le protocle HTTP a mis à notre dispostion: l'entête "WWW-Authenticate".
Il suffit de renvoyer dans l'entête de la page un ligne comme
WWW-Authenticate: Basic realm=\"something\"
pour indiquer au navigateur web qu'il faut demander un mot de passe à l'utilisateur.
Le navigateur web renvoie dans ce cas la saisie de l'utilisateur dans l'entête de sa requête.
Après il ne reste qu'à analyser ledit entête et repérer la ligne qui va bien:
Authorization: Basic dGVzdDp0ZXN0
Si la ligne est absente ou différente, renvoyer le code 401 dans la page web. Sinon renvoyer la page désirée.
Bien sûr le code ici dépend de l'utilisateur/mot de passe saisi. Dans notre exemple il faut saisir 'test' pour l'utilisateur et 'test' pour le mot de passe.
Avec cette méthode, le navigateur web gère la saise du mot de passe et peut le mémoriser si l'utilisateur le demande, et le mot de passe ne circule pas trop en clair sur le réseau. Cerise sur le gateau, presque rien à ajouter côté code Arduino !
Code complet, adapté de l'exemple WebServer de l'IDE Arduino:
/*
Web Server
A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 20 july 2014
by C. Brandt
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,2);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
//---- quelques variables locales
char headerLine[80];
char headerIndex;
bool passwordOk;
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
//---- initialisation variables
passwordOk = false;
headerIndex = 0;
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
if (passwordOk)
{
//---- envoi page web normale ----
client.println("HTTP/1.1 200 OK");
client.println ("WWW-Authenticate: Basic realm=\"something\"");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("
");
}
client.println("</html>");
}
else
{
//---- envoi code d'erreur 401 ----
client.println("HTTP/1.1 401 OK");
client.println ("WWW-Authenticate: Basic realm=\"something\"");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("mot de passe incorrect");
client.println("</html>");
}
break;
}
if (c == '\n') {
//---- test ligne d'entete avec mot de passe
headerLine[headerIndex] = 0;
headerIndex = 0;
Serial.println (headerLine);
if (strcmp (headerLine, "Authorization: Basic dGVzdDp0ZXN0") == 0)
passwordOk = true;
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
//---- mémorisation ligne d'entete courante
if (headerIndex < 79)
headerLine[headerIndex++] = c;
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}