Задать вопрос
@kondratev-ad

Как сделать единую точку входа в nginx через auth_basic?

Допустим есть два приложения на host1.ru и host2.ru. Хочу сделать защиту через auth_basic. Проблема в том, что при заходе на host1.ru с логин/пароль и нажатием ссылки перехода на host2.ru, nginx опять запрашивает пароль на страницу. Можно ли как-нибудь сделать так, чтобы при заходе на одном сайте, и переходе на другой через ссылку, на втором не нужно было бы снова вводить логин/пароль на страницу?
default.conf

user nginx;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/site-enabled/*.conf;

events {
    worker_connections  1024;
}
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    proxy_set_header Host $host;
    auth_basic "HTTP Basic Authentication";   #Пароль на страницу
    auth_basic_user_file page_pass/my_pass;

    server_names_hash_bucket_size 64;
    server_name_in_redirect off;
    server {
        return 404;
    }
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    access_log var/log/nginx/hosts/all_access.log;
    error_log var/log/nginx/hosts/all_error.log;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-available/*;
}


host1.conf

server {
  listen 80;
  server_name host1.ru;

  location / {
    proxy_set_header Host $host;
    proxy_pass http://host1:8000;
  }
}


host1.conf

server {
  listen 80;
  server_name host2.ru;

  location / {
    proxy_set_header Host $host;
    proxy_pass http://host2:8000;
  }
}

  • Вопрос задан
  • 165 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Никак, http auth помнит авторизацию только для конкретного сайта/домена. Придётся перейти на общий домен, смириться с двумя авторизациями или отказаться от http auth вообще. К слову, её в интернетах вообще используют исчезающе редко, так как она сильно неудобна для пользователя не только по причине отсутствия кроссдоменности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
Комментировать
@garbagecollected
Можно, но это относительно не безопасно.
Вам надо заменить все ссылки на host2.ru вот на такой шаблон:
https://имя:пароль@host2.ru/остальная/ссылка?включая=параметры#можно_с_хешем

то есть, можно выполнить код:
<script>
  // Поиск всех ссылок
  document.querySelectorAll('a[href]').forEach(a=>{
    // Если у ссылки определенный хост 
    if(a.hostname == 'host2.ru'){
      const credentials = `имя:пароль`;  // в этом месте заменить имя и пароль на текущие средствами PHP
      // меняем в ссылке https:// на https://имя:пароль@
      a.href = a.href.replace(/^(https?):\/\//,'$1://'+credentials+'@');
    }
  });
</script>

Теперь все ссылки не будут требовать логин-пароль
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы