Я пытаюсь авторизовать доступ к репозиториям 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? После этого, как я могу получить введенную информацию в моей конечной точке?