Отсутствует заголовок авторизации при проксировании NGINX на поддомен

Вопрос или проблема

Привет, я использую Laravel на сервере NGINX и хотел бы использовать возможность обратного прокси NGINX в качестве API шлюза для моего Laravel и других приложений API на Node. Вот мои конфигурации:

URL приложения: staging-app.example.com
Конечная точка API приложения: staging-app.example.com/api
URL API шлюза: api.example.com

Что я хочу сделать, так это перенаправить все API-запросы api.example.com/staging-app на staging-app.example.com/api. Я добился перенаправления API-запроса, но, как-то, Authorization header не передается прокси, что приводит к ошибке 401 неавторизован. Тогда как другие заголовки передаются.

Вот моя текущая конфигурация для api.example.com в nginx:

server {
        server_name api.example.com;

        location /staging-app {
                rewrite ^/staging-app/(.*)$ /$1 break; 
                proxy_pass http://staging-app.example.com/;
        }

        location /test {
                rewrite ^/test/(.*)$ /$1 break;
                proxy_pass http://127.0.0.1:3333/;
         }

    listen [::]:443 ssl; # управляется Certbot
    listen 443 ssl; # управляется Certbot
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # управляется Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # управляется Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot

}
server {
    if ($host = api.example.com) {
        return 301 https://$host$request_uri;
    } # управляется Certbot

        listen 80;
        listen [::]:80;

        server_name api.example.com;
    return 404; # управляется Certbot
}

А для моего приложения Laravel я использую конфигурацию, предоставленную самим Laravel

Обновление 1: Я пытался добавить proxy_set_header Test testingvalue в блок location напрямую, но это тоже не сработало.

Попробуйте добавить следующее в вашу конфигурацию для сервера, слушающего на порту 443:

proxy_http_version 1.1;
proxy_set_header   "Connection" "";

Это сделает соединение между мастер-сервером и агентами постоянным, что необходимо для аутентификации в некоторых конфигурациях.

документация по конфигурации

документация по nginx keep-alive

Вы пробовали этот ответ?

Добавьте в блок location эти записи:

proxy_set_header  Authorization $http_authorization;
proxy_pass_header Authorization;

Ответ или решение

Отсутствие заголовка Authorization при проксировании NGINX к поддомену

Когда вы настраиваете NGINX как обратный прокси для вашего приложения на Laravel, важно правильно передавать заголовки, особенно заголовок авторизации (Authorization). Ваша конфигурация уже делает некоторые шаги в этом направлении, однако есть проблема с отсутствием заголовка Authorization в запросах, что приводит к ответу 401 Unauthorized.

Проблема

Вы настроили проксирование с api.example.com на staging-app.example.com/api, но заголовок Authorization не пересылается, что может быть вызвано следующими причинами:

  • Конфигурация NGINX: По умолчанию, NGINX не передает заголовок Authorization. Его необходимо указать явно.
  • Проблемы с соединением: Отсутствие постоянного соединения может также стать причиной, особенно если ваше приложение требует сохранения состояния.

Решение

Для того чтобы устранить проблему с отсутствием заголовка Authorization, внесите следующие изменения в конфигурацию вашего NGINX:

  1. Передача заголовка Authorization: Добавьте явную директиву proxy_set_header для передачи заголовка Authorization из исходного запроса. Это можно сделать следующим образом:
server {
    server_name api.example.com;

    location /staging-app {
        rewrite ^/staging-app/(.*)$ /$1 break; 
        proxy_pass http://staging-app.example.com/;

        # Добавление передачи заголовка Authorization
        proxy_set_header Authorization $http_authorization;

        # Опционально, передача заголовка по умолчанию
        proxy_pass_header Authorization;

        # Убедитесь, что используете правильную версию HTTP
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    location /test {
        rewrite ^/test/(.*)$ /$1 break;
        proxy_pass http://127.0.0.1:3333/;
    }

    # SSL конфигурация
    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = api.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;

    server_name api.example.com;
    return 404; # managed by Certbot
}
  1. Постоянное соединение: Убедитесь, что proxy_http_version установлен в «1.1» и добавлен proxy_set_header Connection "" для поддержки постоянного соединения. Это важно, если ваше приложение использует методы аутентификации, которые зависят от состояния соединения.

  2. Тестирование конфигурации: После внесения изменений обязательно протестируйте конфигурацию NGINX с помощью команды:

sudo nginx -t

Если все тесты пройдены, перезапустите NGINX:

sudo systemctl restart nginx

Заключение

Таким образом, для успешной передачи заголовка Authorization при проксировании запросов через NGINX необходимо внести изменения в конфигурацию, включая обновление заголовков и использование постоянного соединения. После применения этих рекомендаций ваше приложение на Laravel должно успешно обрабатывать все запросы к API с корректно переданными заголовками авторизации. Если проблемы сохраняются, убедитесь, что на стороне вашего приложения нет дополнительных ограничений или проверок, блокирующих доступ.

Оцените материал
Добавить комментарий

Капча загружается...