Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Nginx - заголовок авторизации (переадресация на камеру с паролем)

1

Заголовок авторизации в Nginx для проксирования на бэкенд с базовой авторизацией (с помощью htpasswd).

Если проксируемый ресурс защищен с помощью htpasswd, то при проксировании через nginx вы будете получать 403 ошибку HTTP (Необходимо авторизоваться).

"user:password" # стандартная форма записи авторизационной комбинации curl http://foo:bar@example.ru

Попытка проксировать при помощи ссылки вида curl приводит к ошибке формата ссылки в Nginx.

Решение этой проблемы - использование заголовка авторизации HTTP. RFC определяет этот заголовок как строку:

user:password

переведенную в 64-ричную систему счисления (транспортное кодирование). IP калькулятор позволяет это сделать.

После преобразования эта строка будет иметь вид:

dXNlcjpwYXNzd29yZA==

Важно! Base64 - это не шифрование.

Нужно помнить о безопасности. Пользоваться этой возможностью не безопасно, так как в первом случае связка передается в открытом виде в заголовке GET запроса, во втором случае тоже в открытом виде в заголовке Authorization. В этом случае лучше использовать SSL соединение.

Итак, настроим Nginx

Мы хотим проксировать ресурс 6.6.6.6. Во-первых необходимо настроить на сервере location:

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://6.6.6.6:80;
}

В нашем случае этот ресурс защищен htpasswd комбинацией логин: "king" пароль: "isnaked". Тогда получаем стандартную запись:

king:isnaked

В Base64 это выглядит так:

a2luZzppc25ha2Vk

Второе - необходимо добавить заголовок в location, передаваемый проксируемому серверу. Это можно сделать с помощью директивы proxy_set_header.

proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";

Полностью location будет выглядеть так:

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://6.6.6.6:80;
    proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
}

Правильно рестаруем nginx и все готово.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx restart

Проксируем изображение с web камеры без пароля

Ниже приведена типичная конфигурация для проксирования статического изображения с IP камеры

Для HIKVISION DS-2CD2412F-IW логин: admin пароль: 12345

location /img/{
    # можно выбрать основной или дополнительный профиль 1,2
    proxy_pass "http://192.0.0.64/Streaming/channels/1/picture?snapShotImageType=JPEG"; 
    proxy_set_header Authorization "Basic YWRtaW46MTIzNDU=";
}

Для DLINK DCS-2103 логин: admin пароль: admin

location /img/{
    # можно выбрать отдельный профиль 1...4
    proxy_pass "http://192.168.0.20/dms?nowprofileid=1"; 
    proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}

Для DLINK DCS-3010 (DCS-2010) логин: admin пароль: admin

location /img/{
    # можно выбрать отдельный профиль 1...4
    proxy_pass "http://192.168.0.20/GetImage.cgi?CH=1"; 
    proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}

Для AXIS M1011-W логин: admin пароль: admin

location /img/{
    proxy_pass "http://192.168.0.20/axis-cgi/jpg/image.cgi";
    proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}

Для JpgStreamer логин: admin пароль: admin

location /img/{
    proxy_pass "http://192.168.0.20/?action=snapshot";
    proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}

Добавим кэширование изображение с web камеры при проксировании

Чтобы постоянно не обращаться к камере, для ускорения загрузки, можно кэшировать изображение. Это делается не просто, а очень просто. Для кэширования изображения при проксировании с камеры, нужно воспользоваться директивой proxy_cache в location и определить proxy_cache_path в секции http:

http {
    ...
     proxy_cache_path  /var/www/cache/local levels=1:2 keys_zone=camera_image_local_cache:1m inactive=30m max_size=512M;
     proxy_temp_path   /var/www/cache/local/tmp;
    ...
    server {
        ...
        location /img/{
            # на примере hikvision
            proxy_pass "http://192.0.0.64/Streaming/channels/1/picture?snapShotImageType=JPEG"; 
            proxy_set_header Authorization "Basic YWRtaW46MTIzNDU=";
            proxy_cache camera_image_local_cache;
            proxy_cache_valid 200 302 404 1m;
            # Обычно в заголовках камеры запрет кэширования 
            proxy_ignore_headers Cache-Control;
        }
        ...
    }
}

Удачи!



  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

12.09.2014

Обновление

05.05.2022

Категории

nginx

Тэги

  • nginx 11
  • streaming 7

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor