Pages: 1 [2] 3 4   Go Down
Author Topic: Problema login arduino ethernet  (Read 5505 times)
0 Members and 1 Guest are viewing this topic.
Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il problema è che ogni volta che si fa una richiesta avviene il controllo dell'user e password e non trovandola viene messa false.
Ecco perché torna alla pagina di login.

Ho messo i parametri della mia rete... dovresti modificarli per la tua.

Code:
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = {
  192, 168, 40, 220 }; // ip in lan
byte gateway[] = {
  192, 168, 40, 254 }; // ip in lan
byte subnet[] = {
  255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
boolean login = false;

void setup(){
  delay(2000);

  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  Serial.print("Serial Start! at ");
  Serial.print(millis());
  Serial.println(" millisecond.");

  Ethernet.begin(mac, ip, gateway, gateway, subnet);  
  delay(1000);

  Serial.println("Ethernet configured");
  Serial.print("Local IP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("SubnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server: ");
  Serial.println(Ethernet.dnsServerIP());

  Serial.println("Wait client...");
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Client connect");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c);
        // Serial.print("readString: ");
        // Serial.println(readString);
        if (c == '\n' && currentLineIsBlank){
          Serial.print("--> ");
          Serial.println(readString);
          WebPage(client);
          //clearing string for next read
          readString="";
          //stopping client
          client.stop();  
        }
      }
    }
    Serial.println("Client disconnect");
  }
}


void WebPage (EthernetClient &client){

  // Check Login
  if(readString.indexOf("Nome=user&Pwd=pass") > 0) {
    login=true;
    Serial.println("Login OK ");
  }
  else {
    login=false;
    Serial.println("No Login");
  }

  // Check Led
  if(login==true){
    if(readString.indexOf("L=1") > 0) {
      digitalWrite(3, HIGH); // set the LED on
      LED1ON = true;
    }

    if(readString.indexOf("L=01") > 0)
    {
      //led has to be turned OFF
      digitalWrite(3, LOW); // set the LED OFF
      LED1ON = false;
    }

    if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
      //led has to be turned ON
      digitalWrite(5, HIGH); // set the LED on
      LED2ON = true;
    }

    if(readString.indexOf("L=02") > 0)  
    {
      //led has to be turned OFF
      digitalWrite(5, LOW); // set the LED OFF
      LED2ON = false;
    }

    if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
      //led has to be turned ON
      digitalWrite(6, HIGH); // set the LED on
      LED3ON = true;
    }

    if(readString.indexOf("L=03") > 0)
    {
      //led has to be turned OFF
      digitalWrite(6, LOW); // set the LED OFF
      LED3ON = false;
    }
  }

  // INIZIO DICHIARAZIONE PAGINA HTML
  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println();
  client.print(F("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));

  // Finestra di login
  if (login==false) {
    // client.print(F("<form action='http://192.168.40.220/'>"));
    client.print(F("<form>"));
    client.print(F("Nome"));    
    client.print(F("utente: <input name='Nome' value=''>"));
    client.print(F("Password: <input type='Password' name='Pwd' value=''>"));
    client.print(F("<input type='submit' value=' OK '>"));
    client.print(F("</form>"));
  }

  // Login OK
  if (login==true) {
    //Primo led
    client.println(F("<hr />"));
    client.println(F("<h1>LED1</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED1ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //Secondo led
    client.println(F("<h1>LED2</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED2ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //terzo led
    client.println(F("<h1>LED3</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED3ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>"));
  } //chiude if login=true
  client.println(F("</body></html>"));
}

potresti togliere questa parte
Code:
  else {
    login=false;
    Serial.println("No Login");
  }
ma in questo modo una volta fatto il login la variabile non diventerebbe mai "false".
« Last Edit: December 22, 2012, 11:27:05 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a me continua a non funzionare, sempre la stessa cosa dopo il login clicco su ON oppure OFF e torna alla pagina di login

Serial Start! at 1999 millisecond.
Ethernet configured
Local IP: 192.168.1.220
SubnetMask: 255.255.255.0
Gateway: 192.168.1.200
DNS Server: 192.168.1.200
Wait client...
Client connect
--> GET / HTTP/1.1

No Login
Client disconnect
Client connect
--> GET /?Nome=user&Pwd=pass HTTP/1.1

Login OK
Client disconnect
Client connect
--> GET /?L=1 HTTP/1.1

No Login
Client disconnect
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, lo so che non funziona.... ho tirato fuori il mio Arduino R3 + Ethernet shield e sto provando "con mano" il codice.
Il problema come ti ho detto nel messaggio precedente è che ogni volta che invii un comando all'Arduino lui fa il check della login.
Bisognerebbe aggiungere una variabile firstlogin in modo da discriminare se il login è stato già fatto.
Adesso ci lavoro un po' su.  smiley-grin
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho rivisto la logica del login.
Ho aggiunto un timeout impostatile (adesso è 60 secondi) e un pulsante Exit.

Code:
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = {
  192, 168, 40, 220 }; // ip in lan
byte gateway[] = {
  192, 168, 40, 254 }; // ip in lan
byte subnet[] = {
  255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
boolean login = false;

unsigned int currentmillis = 0;
unsigned int interval = 60*1000;

void setup(){
  delay(2000);

  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  Serial.print("Serial Start! at ");
  Serial.print(millis());
  Serial.println(" millisecond.");

  Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  delay(1000);

  Serial.println("Ethernet configured");
  Serial.print("Local IP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("SubnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server: ");
  Serial.println(Ethernet.dnsServerIP());

  Serial.println("Wait client...");
  currentmillis = millis();
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Client connect");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c);
        if (c == '\n' && currentLineIsBlank){
          Serial.print("--> ");
          Serial.println(readString);
          CheckLogin();
          if(login==true) CheckLed();
          WebPage(client);
          //clearing string for next read
          readString="";
          //stopping client
          client.stop(); 
        }
      }
    }
    Serial.println("Client disconnect");
  }
}


void WebPage (EthernetClient &client){
  // INIZIO DICHIARAZIONE PAGINA HTML
  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println();
  client.print(F("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));

  // Finestra di login
  if (login==false) {
    // client.print(F("<form action='http://192.168.40.220/'>"));
    client.print(F("<form>"));
    client.print(F("Nome"));   
    client.print(F("utente: <input name='Nome' value=''>"));
    client.print(F("Password: <input type='Password' name='Pwd' value=''>"));
    client.print(F("<input type='submit' value=' OK '>"));
    client.print(F("</form>"));
  }

  // Login OK
  if (login==true) {
    //Primo led
    client.println(F("<hr />"));
    client.println(F("<h1>LED1</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED1ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //Secondo led
    client.println(F("<h1>LED2</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED2ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //terzo led
    client.println(F("<h1>LED3</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED3ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>"));

    client.println(F("<hr />"));
    //Exit
    //  client.println(F("<h1>Exit</h1>"));
    //  client.println(F("<br />"));
    client.print(F("<h2><a href='/?L=Exit'>Exit</a>"));

  } //chiude if login=true
  client.println(F("</body></html>"));
}


void CheckLogin() {
  // Check Login
  if ((millis() - currentmillis) > interval){
    login = false;
    currentmillis = millis();
    Serial.println("Login Timeout");
  }
  if (readString.indexOf("Nome=user&Pwd=pass") > 0) {
    login=true;
    currentmillis = millis();
    Serial.println("Login OK ");
  }
  if (readString.indexOf("L=Exit") > 0) {
    login=false;
    Serial.println("No Login");
  }
}


void CheckLed() {
  // Check Led

    if(readString.indexOf("L=1") > 0) {
    digitalWrite(3, HIGH); // set the LED on
    LED1ON = true;
  }

  if(readString.indexOf("L=01") > 0)
  {
    //led has to be turned OFF
    digitalWrite(3, LOW); // set the LED OFF
    LED1ON = false;
  }

  if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
    //led has to be turned ON
    digitalWrite(5, HIGH); // set the LED on
    LED2ON = true;
  }

  if(readString.indexOf("L=02") > 0) 
  {
    //led has to be turned OFF
    digitalWrite(5, LOW); // set the LED OFF
    LED2ON = false;
  }

  if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
    //led has to be turned ON
    digitalWrite(6, HIGH); // set the LED on
    LED3ON = true;
  }

  if(readString.indexOf("L=03") > 0)
  {
    //led has to be turned OFF
    digitalWrite(6, LOW); // set the LED OFF
    LED3ON = false;
  }
}
« Last Edit: December 22, 2012, 12:17:36 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Senti non ho parole...funziona alla grande
ma tu di professione fai il programmatore?

Ora nella mia ignoranza totale cerco almeno di capire la logica del tuo codice con la speranza di imparare

Grazie infinite per la tua disponibilità gentilezza e soprattutto per la tua professionalità.

Cmq poi aprirò sicuramente un'altro post per avere delle delucidazioni in merito alle uscite disponibili dell' Arduino Ethernet
tipo l'uscita 0 e 1, che ho capito che servono per la programmazione via seriale, ma poi staccato la seriale
si possono usare?
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non sono un programmatore ne un elettronico. ho solo un po' di passione e mi documento su quello che mi interessa.
I pin 0 e 1 sono collegati alla seriale hardware del chip di Arduino e sono usate per la programmazione via seriale.
Possono essere usate per il proprio progetto per collegare periferiche seriali come i moduli bluetooth.

Credo che nel codice che ho scritto ci sia un problema col timeout.  smiley-sweat
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

facendo qualche prova mi sembra che dopo il login accendo un led aspetto il timeout
se provo a cambiare lo stato di qualche led torna alla pagina di login, però se faccio il login di nuovo
non mi porta sulla gestione dei led, ma resta sempre nella pagina del login, a questo punto non basta
chiudere e riaprire il browser, ma devo resettare l'Arduino.
Per avere conferma ho commentato tutto il codice relativo al timeout e sembra funzionare bene.

« Last Edit: December 22, 2012, 01:02:42 pm by format » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Adesso dovrebbe andare. Più o Meno.  smiley-wink

Code:
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
IPAddress ip(192, 168, 40, 15);       
IPAddress gateway(192, 168, 40, 254); 
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
boolean login = false;

unsigned int previousMillis = 0;
unsigned int currentMillis = 0;
unsigned int interval = 60*1000;

void setup(){
  delay(2000);

  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  Serial.print("Serial Start! at ");
  Serial.print(millis());
  Serial.println(" millisecond.");

  Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  // delay(2000);

  Serial.println("Ethernet configured");
  Serial.print("Local IP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("SubnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server: ");
  Serial.println(Ethernet.dnsServerIP());

  Serial.println("Wait client...");
}

void loop(){
  currentMillis = millis();
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Client connect");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c);
        if (c == '\n' && currentLineIsBlank){
          Serial.print("--> ");
          Serial.println(readString);
          CheckLogin();
          if(login==true) CheckLed();
          WebPage(client);
          //clearing string for next read
          readString="";
          //stopping client
          client.stop(); 
        }
      }
    }
    Serial.println("Client disconnect");
  }
}

void CheckLogin() {
  if (currentMillis - previousMillis > interval){
    login = false;
    previousMillis = currentMillis;
    Serial.println("Login Timeout");
  }
  if (readString.indexOf("Nome=user&Pwd=pass") > 0) {
    login=true;
    previousMillis = currentMillis;
    Serial.println("Login OK ");
  }
  if (readString.indexOf("L=Exit") > 0) {
    login=false;
    Serial.println("No Login");
  }
}


void WebPage (EthernetClient &client){
  // INIZIO DICHIARAZIONE PAGINA HTML
  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println();
  client.print(F("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));

  // Finestra di login
  if (login==false) {
    // client.print(F("<form action='http://192.168.40.220/'>"));
    client.print(F("<form>"));
    client.print(F("Nome"));   
    client.print(F("utente: <input name='Nome' value=''>"));
    client.print(F("Password: <input type='Password' name='Pwd' value=''>"));
    client.print(F("<input type='submit' value=' OK '>"));
    client.print(F("</form>"));
  }

  // Login OK
  if (login==true) {
    //Primo led
    client.println(F("<hr />"));
    client.println(F("<h1>LED1</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED1ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //Secondo led
    client.println(F("<h1>LED2</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED2ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>"));
    client.println(F("<hr />"));

    //terzo led
    client.println(F("<h1>LED3</h1>"));
    client.println(F("<br />"));
    //printing LED status
    client.print(F("<span>STATO LED: </span>"));

    if (LED3ON) {
      client.println(F("<span style='color:green'>ON</span>"));
    }
    else
    {
      client.println(F("<span style='color:grey'>OFF</span>"));
    }
    client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>"));

    client.println(F("<hr />"));
    //Exit
    //  client.println(F("<h1>Exit</h1>"));
    //  client.println(F("<br />"));
    client.print(F("<h2><a href='/?L=Exit'>Exit</a>"));

  } //chiude if login=true
  client.println(F("</body></html>"));
}


void CheckLed() {
  // Check Led

    if(readString.indexOf("L=1") > 0) {
    digitalWrite(3, HIGH); // set the LED on
    LED1ON = true;
  }

  if(readString.indexOf("L=01") > 0)
  {
    //led has to be turned OFF
    digitalWrite(3, LOW); // set the LED OFF
    LED1ON = false;
  }

  if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
    //led has to be turned ON
    digitalWrite(5, HIGH); // set the LED on
    LED2ON = true;
  }

  if(readString.indexOf("L=02") > 0) 
  {
    //led has to be turned OFF
    digitalWrite(5, LOW); // set the LED OFF
    LED2ON = false;
  }

  if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
    //led has to be turned ON
    digitalWrite(6, HIGH); // set the LED on
    LED3ON = true;
  }

  if(readString.indexOf("L=03") > 0)
  {
    //led has to be turned OFF
    digitalWrite(6, LOW); // set the LED OFF
    LED3ON = false;
  }
}
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora funziona alla grande.
Ma tutto questo codice potrei metterlo anche su una SD?
Ma la F dopo print a cosa serve?



Grazie ancora
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per metterlo su una SD bisognerebbe modificare pesantemente il codice scritto.
La funzione F serve per risparmiare memoria dicendo ad Arduino di caricare il testo direttamente dalla memoria flash e non dalla memoria Ram.
Funziona solo con il testo "statico" e non con le variabili. Però e molto utile in questi casi, così Arduino non si impalla per mancanza di memoria.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3486
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io per 401 intendevo questo

Code:
void WebPage (EthernetClient &client){
  // INIZIO DICHIARAZIONE PAGINA HTML  
  client.print("HTTP/1.1 401 Authorization Required\r\n");
  client.print("WWW-Authenticate: Basic realm=\"mio login\"\r\n");
  //client.println();
  //client.println(F("HTTP/1.1 200 OK"));
  //client.println(F("Content-Type: mime/type"));
  client.println();
  client.print(F("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));

Queste 2 righe fanno apparire il popup di autenticazione da qualsiasi client compatibile compresi gli smartphone, se non altro questa non è visibile sulla get ed è minimamente criptata in base64, nel char c = client.read(); viene racchiuso l'user e pass codificato, resta solo confrontare la stringa che si può leggere in fase di realizzazione con l'uso di debug o online usando una decodifica base64 senza l'uso di nessuna libreria,  poi ci sarebbe l'algoritmo  MD5 un po' più complicato ma fattibile lo stesso la cifratura è un po' più complessa e più difficile intercettarla e decodificarla.

ciao
« Last Edit: December 22, 2012, 05:11:08 pm by pablos » Logged

no comment

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessante.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho applicato queste righe:
client.print("HTTP/1.1 401 Authorization Required\r\n");
client.print("WWW-Authenticate: Basic realm=\"mio login\"\r\n");
al codice però non funziona bene, nel senso che mi esce la richiesta di login, ma se faccio annulla
torno al login del codice originale, inoltre se provo ad accendere / spegnere un led mi compare sempre il popup
di autenticazione.
Quindi credo che bisognerebbe adattare tutto il codice per questo tipo di login.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3486
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo, ho scritto le righe del richiamo, poi devi fare tu le tue elaborazioni dei response ricevuti leggendo il char c, sono meno modifiche di quanto credi, una volta avute le credenziali puoi lanciare il 200 altrimenti sempre il 401
« Last Edit: December 22, 2012, 05:53:34 pm by pablos » Logged

no comment

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3486
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usando ad esempio questa pag http://www.motobit.com/util/base64-decoder-encoder.asp
scrivendo adminadmin (user=admin ... passw=admin) otterrai questa stringa YWRtaW5hZG1pbg== ... dovrai cercarla nel char c  se readString è == a "YWRtaW5hZG1pbg=="  manda le altre linee del client.print con codice 200, altrimenti rimandami un 401 dove in pratica riapri il popup, oppure se la pass è sbagliata scrivi con codice 200 client.print Pass errata + un tasto nella pagina "ritorna al login" rilanciando nuovamente un 401 e così all'infinito.

Comunque dipende dal livello di sicurezza che vuoi ottenere. Con la stringa ottenuta dalla decodifica MD5 invece di 16 caratteri ne hai 32, ma a differenza del base64 l'MD5 non è reversibile cioè dalla stringa codificata non si può risalire a user e pass (o comunque è molto difficile si ottengono molte probabilità e molti conflitti) mentre se nel link che ho incollato prima scrivi ..... decodifica questa stringa a base64 YWRtaW5hZG1pbg== puoi risalire all'user e alla pass che poi vai a scrivere nel popup (però prima mi devo attrezzare per intercettarla)

Se a un utente interessa invece codificare tutto il traffico in entrata e in uscita ad esempio il get?on=1 allora deve usare la libreria di codifica e decodifica base64 o la pesantissima MD5, tutto ciò però succhia risorse ad arduino, un 16 MHz è un po' limitato a fare tutto ciò, ma non è impossibile

in linea di principio per avere una maggior sicurezza servirebbe l'https, in questo caso arduino deve essere dietro a un server ben fatto

ciao
« Last Edit: December 22, 2012, 06:44:32 pm by pablos » Logged

no comment

Pages: 1 [2] 3 4   Go Up
Jump to: