Назад | Перейти на главную страницу

Авторизация доступа к git-http-backend с помощью функции Nginx http_auth_request

Я пытаюсь авторизовать доступ к репозиториям Git, используя сервер авторизации Python за сервером NGINX.

Я видел множество примеров того, как обрабатывать авторизацию git-http-backend с использованием авторизации HTTP Basic. Однако я хотел бы пойти дальше, проверив учетные данные на сервере, а не проверяя файл паролей.

Я обнаружил, что в nginx есть функция http_auth_request, которая звучит рядом с тем, что я ищу. Они предоставляют пример для его использования.

После прочтения моя текущая конфигурация nginx выглядит так:

worker_processes auto;
worker_cpu_affinity auto;

events {
    multi_accept on;
    worker_connections 1024;
}

http {
    upstream aiohttp {
        server 127.0.0.1:8081 fail_timeout=0;
    }

    server {
        listen       8080;
        server_name  git.example.com;

        location ~ /git(/.*) {
            # This creates a prompt for credentials and works
            #auth_basic           "Git Server";
            #auth_basic_user_file /srv/htpasswd;

            # This seems to do nothing
            auth_request /auth;
            auth_request_set $auth_status $upstream_status;

            include       fastcgi_params;
            fastcgi_param SCRIPT_FILENAME     /usr/lib/git-core/git-http-backend;
            fastcgi_param GIT_HTTP_EXPORT_ALL "";
            fastcgi_param GIT_PROJECT_ROOT    /srv/git;
            fastcgi_param PATH_INFO           $1;
            fastcgi_pass  unix:/run/fcgiwrap.sock;
        }

        location = /auth {
            internal;

            proxy_pass http://aiohttp/authorize;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
        }
    }
}

Как отмечается в комментариях, прокомментированная авторизация HTTP Basic работает так, как задумано: git предлагает пользователю ввести имя пользователя и пароль и проверяет, а не /srv/htpasswd.

Для строк auth_request никаких подсказок не предоставляется. Моя конечная точка - это простая асинхронная функция Python, запускаемая aiohttp:

@routes.get("/authorize")
async def authorize_user_via_get(request):
    print(request)
    print(request.headers)
    raise web.HTTPOk(text="All good!")  # 200 OK response

Я ожидаю, что это всегда будет запрашивать у пользователя учетные данные, но будет проходить независимо от того, что они вводят, поскольку он отвечает 200 OK на все запросы. Однако, похоже, это не влияет на git-http-backend.

Итак, мой вопрос: как я могу заставить Git запрашивать у пользователя учетные данные, используя мой метод http_auth_request? После этого, как я могу получить введенную информацию в моей конечной точке?