W5100 - авторизация на вебсервере

Тема в разделе "Arduino & Shields", создана пользователем kt315where, 4 дек 2017.

  1. kt315where

    kt315where Гик

    Здравствуйте

    в сборке используется Arduino Uno и шилд W5100
    Шилд подключен к домашнему роутеру LAN кабелем. Ардуино UNO управляет вкл/выкл реле через веб интерфейс.

    Сделал подключение из внешнего интернета (по NAT, в настройках роутера), теперь доступ есть из внешнего интернета

    Всё отлично работает. Но хотелось бы сделать хоть самую простую, но авторизацию, чтобы никто чужой не смог включать моё реле. Хотел срисовать по аналогии с какого-нибудь готового скетча, но найти рабочий вариант так и не смог. Может кто-то делал и может поделиться кодом, ну или подкиньте скетч с авторизацией (логин-пароль), буду очень признателен.
     
  2. rkit

    rkit Гуру

    С этими игрушками обычно делают неочевидный путь к странице и все.
     
    kt315where нравится это.
  3. SergeiL

    SergeiL Оракул Модератор

    В примерах к ESP8266 есть пример "SimpleAuthentification"
    Он для ESP, но сделать по аналогии, с использованием «Cookie», для W5100 - не сложно! ;)

    Код (C++):
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>

    const char* ssid = "........";
    const char* password = "........";

    ESP8266WebServer server(80);

    //Check if header is present and correct
    bool is_authentified(){
      Serial.println("Enter is_authentified");
      if (server.hasHeader("Cookie")){
        Serial.print("Found cookie: ");
        String cookie = server.header("Cookie");
        Serial.println(cookie);
        if (cookie.indexOf("ESPSESSIONID=1") != -1) {
          Serial.println("Authentification Successful");
          return true;
        }
      }
      Serial.println("Authentification Failed");
      return false;  
    }

    //login page, also called for disconnect
    void handleLogin(){
      String msg;
      if (server.hasHeader("Cookie")){
        Serial.print("Found cookie: ");
        String cookie = server.header("Cookie");
        Serial.println(cookie);
      }
      if (server.hasArg("DISCONNECT")){
        Serial.println("Disconnection");
        String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
        server.sendContent(header);
        return;
      }
      if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
        if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin" ){
          String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
          server.sendContent(header);
          Serial.println("Log in Successful");
          return;
        }
      msg = "Wrong username/password! try again.";
      Serial.println("Log in Failed");
      }
      String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
      content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
      content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
      content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
      content += "You also can go <a href='/inline'>here</a></body></html>";
      server.send(200, "text/html", content);
    }

    //root page can be accessed only if authentification is ok
    void handleRoot(){
      Serial.println("Enter handleRoot");
      String header;
      if (!is_authentified()){
        String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
        server.sendContent(header);
        return;
      }
      String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>";
      if (server.hasHeader("User-Agent")){
        content += "the user agent used is : " + server.header("User-Agent") + "<br><br>";
      }
      content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>";
      server.send(200, "text/html", content);
    }

    //no need authentification
    void handleNotFound(){
      String message = "File Not Found\n\n";
      message += "URI: ";
      message += server.uri();
      message += "\nMethod: ";
      message += (server.method() == HTTP_GET)?"GET":"POST";
      message += "\nArguments: ";
      message += server.args();
      message += "\n";
      for (uint8_t i=0; i<server.args(); i++){
        message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
      }
      server.send(404, "text/plain", message);
    }

    void setup(void){
      Serial.begin(115200);
      WiFi.begin(ssid, password);
      Serial.println("");

      // Wait for connection
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());


      server.on("/", handleRoot);
      server.on("/login", handleLogin);
      server.on("/inline", [](){
        server.send(200, "text/plain", "this works without need of authentification");
      });

      server.onNotFound(handleNotFound);
      //here the list of headers to be recorded
      const char * headerkeys[] = {"User-Agent","Cookie"} ;
      size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
      //ask server to track these headers
      server.collectHeaders(headerkeys, headerkeyssize );
      server.begin();
      Serial.println("HTTP server started");
    }

    void loop(void){
      server.handleClient();
    }
     
    kt315where нравится это.
  4. YeS

    YeS Гик

    Почитайте здесь. Может устроит вас такой вариант.
     
    Максим B и kt315where нравится это.
  5. kt315where

    kt315where Гик

    Всем спасибо