处理升级Gerrit后REST API无法使用

Posted zeaning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理升级Gerrit后REST API无法使用相关的知识,希望对你有一定的参考价值。

背景:

升级Gerrit,从2.13到3.2

遇到问题:

升级到新版后,rest api无法使用了,要么提示401,要么提示 Unauthorized

官方文档上面,说使用basic auth就能直接连上rest api。匿名用户可以直接查询接口,登录用户,在host后面增加"/a"后缀。

但实际上,我匿名访问,是会报401错误的。

而登录后,又报Unauthorized。

使用htpasswd设置的密码不行,使用Gerrit生成的随机密码也不行。

 

原因分析:

经过一番排查后,发现LDAP认证方式下,直接使用ldap账户和密码,是可以使用Gerrit 的rest api的。

而htpasswd设置的密码,是通过nginx或者Apache进行鉴权的,也就是登录网页的时候,那个弹窗的处理,是Nginx处理的。这时候根本就没有进入到Gerrit,具体可以看官方文档,以及Gerrit的配置,是没有任何指向htpasswd生成的密码文件的。

登录Gerrit Web的时候,使用htpasswd的密码可以进入。但使用rest api的时候,Gerrit也会对账户密码进行校验。这点和web登录是不一样的,问题就出在这里。

使用htpasswd的密码,用postman登入gerrit_site.com/a/projects/时,如果htpasswd密码不对,会有401错误报出来,此时是Nginx报的。输入htpasswd的账户密码,不报401错误了,但返回Unauthorized,此时是Gerrit返回的。

要想登入Gerrit REST API,就得密码正确,也就是要同时满足htpasswd和Gerrit的密码。只有这两个密码一样,才能通过。

解决方案:

方法一:统一htpasswd和Gerrit的HTTP密码。

如果可以修改admin密码(如果admin不方便改密码则新建一个账户,并配置成管理员),则先重置(或者获取已有的)admin账户的Gerrit HTTP密码,在web页面的设置页-HTTP选项上生成。

然后在服务器上执行htpasswd -m gerrit.passwd admin,输入Gerrit的HTTP密码。这样htpasswd的密码和Gerrit的HTTP密码就一样的。

此时admin账户,使用Gerrit的HTTP密码,即可使用postman使用basic auth方式,进行gerrit_site.com/a/projects/的查询和put操作了。

由于Gerrit的HTTP是随机生成的一长串密码,不易使用,可以把密码还原会admin原本的密码。

1、使用Gerrit rest api,写入旧密码到Gerrit上:

具体见:https://gerrit-review.googlesource.com/Documentation/rest-api-accounts.html#set-http-password

2、在服务器上操作htpasswd -m gerrit.passwd admin,输入旧密码

这时候,htpasswd和Gerrit的密码就统一设置成原本的旧密码了。

对于其他需要使用rest api的账户,可以直接使用admin账户,调用rest api,写入账户的HTTP密码到Gerrit上。

方法二:使用LDAP或者OpenID等认证方式

可以使用ldap方式,一般公司内都是会有统一的ldap服务,接入公司的ldap账户,就不存在上面的问题了。

以上是关于处理升级Gerrit后REST API无法使用的主要内容,如果未能解决你的问题,请参考以下文章

处理升级Gerrit后REST API无法使用

Gerrit REST API使用实例

Spring boot:REST API 行为不一致后版本升级

无法为 rest api 手动设置查询参数(使用 mux)

为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot

Gerrit版本升级