Nginx HTTP-авторизация только для git push - PullRequest
8 голосов
/ 23 января 2020

Я размещаю частный git сервер, используя Nginx. Я бы хотел, чтобы кто-нибудь клонировал в мои репозитории (без авторизации), но требует авторизации, если он попытается создать sh коммит.

Моя Nginx конфигурация выглядит следующим образом:

server {
  listen 443 ssl;
  server_name git.example.com;
  ssl_certificate /fullchain.pem;
  ssl_certificate_key /privkey.pem;

  location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|recieve)-pack) {
    root /usr/share/nginx/git;

# --- incorrect solution ---

#    if ($1 = git-upload-pack) {
#        auth_basic "Restricted";
#        auth_basic_user_file /usr/share/nginx/htpasswd;
#    }
    client_max_body_size 0;
    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 $realpath_root;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_param PATH_INFO $uri;
    fastcgi_param unix:/var/fcgiwrap.socket;

  }

Насколько я понимаю, запрос git push отправляет git-receive-pack на мой сервер. Моим простым решением было захватить этот суффикс с помощью $1 и использовать оператор if, но я быстро обнаружил, что это неправильное использование для ifs ( ifisevil ).

Есть ли более подходящее решение для того, что я пытаюсь сделать sh?

Ответы [ 2 ]

5 голосов
/ 03 мая 2020

Попробуйте разделить места:

server {
  listen 443 ssl;
  server_name git.example.com;
  ssl_certificate /fullchain.pem;
  ssl_certificate_key /privkey.pem;

  location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-recieve-pack) {
    # Do your stuff 

  location ~ ^.*\.git/git-upload-pack {
    auth_basic "Restricted";
    auth_basic_user_file /usr/share/nginx/htpasswd;
    # Do your stuff 
3 голосов
/ 06 мая 2020

Вы можете авторизоваться / отклонить на основе request_method.

        if ($request_method ~* "^(POST|PUT|DELETE)$" ) {
                # check if is there a cookie or something like that
                # and redirect to login if not
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...