处理升级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无法使用的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot:REST API 行为不一致后版本升级