带有 AuthzUnixGroup 的 git-http-backend 无法正常工作

Posted

技术标签:

【中文标题】带有 AuthzUnixGroup 的 git-http-backend 无法正常工作【英文标题】:git-http-backend with AuthzUnixGroup not working properly 【发布时间】:2014-08-01 23:02:27 【问题描述】:

我正在尝试在安装了 git 的 CentOS 6 机器上通过我的 Apache 2.2 建立一个 git 存储库。我尝试了许多不同的方向,但我不知所措。我目前的情况包括可以正常clone,但完全无法推送。

似乎我无法让身份验证位正常工作,因为我可以在将http.receivepack 设置为true 时正常执行推送。

我已经安装了AuthzUnixGroupmod_authz_external

我去了/var/www/git并创建了一个名为my-repo.git的repo,并在其中做了一个git init --bare

然后我在/etc/httpd/conf.d/ 中设置我的git.conf 文件如下:

<VirtualHost "*:80">
  SetEnv GIT_HTTP_EXPORT_ALL
  SetEnv GIT_PROJECT_ROOT /var/www/git
  SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
  ScriptAlias /git /usr/libexec/git-core/git-http-backend
  AddExternalAuth pwauth /usr/local/libexec/pwauth
  SetExternalAuthMethod pwauth pipe

  <Directory "/usr/libexec/git-core/">
    AllowOverride None
    Options +ExecCGI -Includes
    Order allow,deny
    Allow from all
  </Directory>

  <Location "/git">
    AuthzUnixGroup on
    AuthType Basic
    AuthName "Git repository"
    AuthBasicProvider external
    AuthExternal pwauth
    Require group git
  </Location>

</VirtualHost>

将我的网络浏览器指向mysite/git 很好地向我显示了 HTTP 基本登录对话框,它运行良好。我已将自己添加到组 git,并在我的 shell 返回上执行 groups

naseri sudo git

符合预期。

当我执行git clone http://mysite/git/my-repo.git 时,我从/var/logs/httpd/access_log 下的httpd 的access_log 文件中得到以下信息:

2.177.130.21 - - [11/Jun/2014:18:51:07 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - - [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 200 256 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:09 +0000] "POST /git/my-repo.git/git-upload-pack HTTP/1.1" 200 368 "-" "git/1.8.5.2 (Apple Git-48)"

在客户端,cloneing 工作正常。我改变了一些东西,然后尝试通过git pushing 内容在提交后推送。

这是我在服务器端日志中得到的:

2.177.130.21 - - [11/Jun/2014:18:53:26 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:27 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:30 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 403 - "-" "git/1.8.5.2 (Apple Git-48)"

我可以看到我的“需要身份验证”响应正在由 Apache 在响应的第一行 (401) 发回,但客户端向我显示:

fatal: unable to access 'http://mysite/git/my-repo.git/': The requested URL returned error: 403

我对这个问题一无所知,因为将我的浏览器指向相同的 URL 会正确地启动身份验证,并且它甚至可以正常工作。

【问题讨论】:

【参考方案1】:

这个older answer

git-http-backend 在客户端要求使用 git-receive-pack 方法时返回 403/Forbidden 代码。 然后它回退到 WebDAV,但没有必要使用 WebDAV

我遇到了同样的问题;在我的情况下,这是由于 REMOTE_USER 未设置

由于我的任何Apache config 在设置变量时都使用了“=”,请检查这是否更好:

SetEnv REMOTE_USER $REDIRECT_REMOTE_USER

(两个变量之间没有'-')

还要检查 not(重新)定义 REMOTE_USER 是否也有效(因为它可能已经定义,而 REDIRECT_REMOTE_USER 可能没有):尝试不使用该行。 我永远不必在我的 Apache Git 配置中定义它。

注意:with Git 2.21 (Q1 2019, 5+ years later), Git should be more robust.

【讨论】:

我尝试了使用和不使用 '=' 并尝试不指定它。没有运气。此外,在检查代码时,它不会要求我提供凭据,我认为这不是正确的工作方式。 @MiladNaseri 你能添加一个Require valid-user 规则,看看它这次是否要求你提供凭据? 问题依然存在。签出时,服务器发送两个 401,然后以 200 响应,产生存储库内容。 我还不能解决这个问题。但是,您的解决方案是唯一尝试正确答案的解决方案,并且正如所承诺的,这是您的奖励,尽管从 2k 到 403k 的用户,它不应该算得那么多:-) @MiladNaseri 确实很重要 :-) 但我会尝试对您的配置进行更多测试,看看是否可以重现该问题。【参考方案2】:

我遇到过这样的情况,发现尝试使用 Apache 服务 git 绝非易事。

相反,我建议安装Gerrit - 它允许托管多个存储库,最重要的是具有极其灵活的用户/组管理和权限模型。作为一个不错的奖励,它也恰好是非常强大的代码审查引擎,但它是完全可选的 - 如果你不想使用代码审查功能,则不必使用。

其他已知的解决方案是 Gitlab 和 Gitolite - 您可能也想研究它们。

【讨论】:

以上是关于带有 AuthzUnixGroup 的 git-http-backend 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?