Arduino:Примеры/Web Authentication

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


HTTP-аутентификация[1]

Этот пример показывает, как при помощи библиотеки Webduino осуществить HTTP-аутентификацию двух пользователей – обычного и администратора.

Код

  1 /* HTTP-аутентификация (Webduino) */
  2 
  3 /* Этот пример написан с учетом того, что вы знакомы с основами 
  4  * библиотеки Ethernet (особенно с настройкой адресов IP и MAC), 
  5  * а также с основами Webduino. И для начала лучше загляните в пример 
  6  * «HelloWorld», если еще не сделали этого. */ 
  7 
  8 /* Вы можете поменять область аутентификации, указав 
  9  * WEBDUINO_AUTH_REALM перед подключением WebServer.h */
 10 #define WEBDUINO_AUTH_REALM "Webduino Authentication Example"
 11 
 12 #include "SPI.h"
 13 #include "Ethernet.h"
 14 #include "WebServer.h"
 15 
 16 /* ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ. MAC-адрес должен отличаться 
 17  * от других девайсов в сети. Если MAC-адрес Ethernet-модуля совпадет 
 18  * с другим MAC-адресом, это повлечет проблемы с получением пакетов.
 19  */
 20 static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 21 
 22 /* ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА. 
 23  * Большинство сетей находятся в диапазонах 192.168.0.XXX 
 24  * или 192.168.1.XXX. Выберите адрес, который не используется 
 25  * и не присваивается автоматически DHCP-сервисом, к которому 
 26  * подключен ваш роутер. */
 27 static uint8_t ip[] = { 192, 168, 1, 210 };
 28 
 29 /* Это создает экземпляр веб-сервера. Как PREFIX указываем "",
 30  * благодаря чему все страницы будут в корне сервера. */
 31 #define PREFIX ""
 32 WebServer webserver(PREFIX, 80);
 33 
 34 void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
 35 {
 36   server.httpSuccess();
 37   if (type != WebServer::HEAD)
 38   {
 39     P(helloMsg) = "<h1>Hello, World!</h1><a href=\"private.html\">Private page</a>";
 40     server.printP(helloMsg);
 41   }
 42 }
 43 
 44 void privateCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
 45 {
 46   /* Если пользователь запросил эту страницу при помощи 
 47    * следующих данных: username = user, password = user, 
 48    * то показываем страницу, говорящую «Hello User». 
 49    * Эти данные должны быть объединены двоеточием (примерно так:
 50    * «username:password») и зашифрованы при помощи Base64, но это
 51    * нужно делать вне Arduino, чтобы сэкономить вычислительные 
 52    * ресурсы. Другими словами, «dXNlcjp1c2Vy» – это «user:user», 
 53    * зашифрованное в Base64. Если вам нужна динамическая смена 
 54    * имени/пароля, поищите в интернете библиотеку Base64. */
 55   if (server.checkCredentials("dXNlcjp1c2Vy"))
 56   {
 57     server.httpSuccess();
 58     if (type != WebServer::HEAD)
 59     {
 60       P(helloMsg) = "<h1>Hello User</h1>";
 61       server.printP(helloMsg);
 62     }
 63   }
 64   /* Если пользователь запросил эту страницу при помощи 
 65    * следующих данных: username = admin, password = admin, 
 66    * то показываем страницу, говорящую «Hello Admin». 
 67    * Другими словами, «YWRtaW46YWRtaW4=» – это «admin:admin. */
 68   else if (server.checkCredentials("YWRtaW46YWRtaW4="))
 69   {
 70     server.httpSuccess();
 71     if (type != WebServer::HEAD)
 72     {
 73       P(helloMsg) = "<h1>Hello Admin</h1>";
 74       server.printP(helloMsg);
 75     }
 76   }
 77   else
 78   {
 79     /* отправляем обратно ошибку 401, запрашивая, чтобы пользователь снова вписал свои данные. */
 80     server.httpUnauthorized();
 81   }
 82 }
 83 
 84 void setup()
 85 {
 86   Ethernet.begin(mac, ip);
 87   webserver.setDefaultCommand(&defaultCmd);
 88   webserver.addCommand("index.html", &defaultCmd);
 89   webserver.addCommand("private.html", &privateCmd);
 90   webserver.begin();
 91 }
 92 
 93 void loop()
 94 {
 95   char buff[64];
 96   int len = 64;
 97 
 98   /* вечно обрабатываем входящие соединения (по одному за раз):*/
 99   webserver.processConnection(buff, &len);
100 }

См.также

Внешние ссылки