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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

Код

/* HTTP-аутентификация (Webduino) */

/* Этот пример написан с учетом того, что вы знакомы с основами 
 * библиотеки Ethernet (особенно с настройкой адресов IP и MAC), 
 * а также с основами Webduino. И для начала лучше загляните в пример 
 * «HelloWorld», если еще не сделали этого. */ 

/* Вы можете поменять область аутентификации, указав 
 * WEBDUINO_AUTH_REALM перед подключением WebServer.h */
#define WEBDUINO_AUTH_REALM "Webduino Authentication Example"

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

/* ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ. MAC-адрес должен отличаться 
 * от других девайсов в сети. Если MAC-адрес Ethernet-модуля совпадет 
 * с другим MAC-адресом, это повлечет проблемы с получением пакетов.
 */
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

/* ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА. 
 * Большинство сетей находятся в диапазонах 192.168.0.XXX 
 * или 192.168.1.XXX. Выберите адрес, который не используется 
 * и не присваивается автоматически DHCP-сервисом, к которому 
 * подключен ваш роутер. */
static uint8_t ip[] = { 192, 168, 1, 210 };

/* Это создает экземпляр веб-сервера. Как PREFIX указываем "",
 * благодаря чему все страницы будут в корне сервера. */
#define PREFIX ""
WebServer webserver(PREFIX, 80);

void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  server.httpSuccess();
  if (type != WebServer::HEAD)
  {
    P(helloMsg) = "<h1>Hello, World!</h1><a href=\"private.html\">Private page</a>";
    server.printP(helloMsg);
  }
}

void privateCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  /* Если пользователь запросил эту страницу при помощи 
   * следующих данных: username = user, password = user, 
   * то показываем страницу, говорящую «Hello User». 
   * Эти данные должны быть объединены двоеточием (примерно так:
   * «username:password») и зашифрованы при помощи Base64, но это
   * нужно делать вне Arduino, чтобы сэкономить вычислительные 
   * ресурсы. Другими словами, «dXNlcjp1c2Vy» – это «user:user», 
   * зашифрованное в Base64. Если вам нужна динамическая смена 
   * имени/пароля, поищите в интернете библиотеку Base64. */
  if (server.checkCredentials("dXNlcjp1c2Vy"))
  {
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
      P(helloMsg) = "<h1>Hello User</h1>";
      server.printP(helloMsg);
    }
  }
  /* Если пользователь запросил эту страницу при помощи 
   * следующих данных: username = admin, password = admin, 
   * то показываем страницу, говорящую «Hello Admin». 
   * Другими словами, «YWRtaW46YWRtaW4=» – это «admin:admin. */
  else if (server.checkCredentials("YWRtaW46YWRtaW4="))
  {
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
      P(helloMsg) = "<h1>Hello Admin</h1>";
      server.printP(helloMsg);
    }
  }
  else
  {
    /* отправляем обратно ошибку 401, запрашивая, чтобы пользователь снова вписал свои данные. */
    server.httpUnauthorized();
  }
}

void setup()
{
  Ethernet.begin(mac, ip);
  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("index.html", &defaultCmd);
  webserver.addCommand("private.html", &privateCmd);
  webserver.begin();
}

void loop()
{
  char buff[64];
  int len = 64;

  /* вечно обрабатываем входящие соединения (по одному за раз):*/
  webserver.processConnection(buff, &len);
}

См.также

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