Здравствуйте в сборке используется Arduino Uno и шилд W5100 Шилд подключен к домашнему роутеру LAN кабелем. Ардуино UNO управляет вкл/выкл реле через веб интерфейс. Сделал подключение из внешнего интернета (по NAT, в настройках роутера), теперь доступ есть из внешнего интернета Всё отлично работает. Но хотелось бы сделать хоть самую простую, но авторизацию, чтобы никто чужой не смог включать моё реле. Хотел срисовать по аналогии с какого-нибудь готового скетча, но найти рабочий вариант так и не смог. Может кто-то делал и может поделиться кодом, ну или подкиньте скетч с авторизацией (логин-пароль), буду очень признателен.
В примерах к 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(); }