Keycloak之17.0.1 版本和Gerrit 整合-yellowcong

时间:2024-10-30 18:47:47

通过keycloak 来实现gerrit的用户管理。主要有几个步骤,1.安装gerrit,2.安装gerrit oauth 插件,3.配置gerrit . 4.创建keycloak的配置,添加realm,client,user ,三个,5.重启gerrit 测试。
17版本不一样的是,需要开启oauth,服务器增加前缀。

准备

Keycloak之17.0.1 版本安装-yellowcong

实现效果

下图可以看到,登录测试,可以正常的登录到gerrit服务上, 美滋滋啊
在这里插入图片描述

设置keyloak 启动带前缀

./bin/ start-dev  --http-relative-path /auth --http-port 8084
  • 1

如果不增加 --http-relative-path /auth这个参数,会导致gerrit插件登陆登陆失败,404 ,由于新版本的oauth路径,去掉了/auth前缀。

auth接入地址,未配置--http-relative-path /auth
在这里插入图片描述

实际请求的地址
在这里插入图片描述

gerrit 安装

gerrit 的官网 /

#下载gerrit
#java 11 
wget /gerrit-3.6.

#java8 
#wget /gerrit-2.11.
wget /gerrit-3.0.


#初始化gerrit,回输入一堆配置,插件全安装
java -jar gerrit-3.0. init -d ./gerrit

#下载gerrit-oauth-provider 插件 ,如果不下载插件,就会导致oauth 功能使用不了
cd gerrit/plugins 

#oauth官网
/davido/gerrit-oauth-provider/
wget //davido/gerrit-oauth-provider/releases/download/v3.0.0/

#重启gerrit 
./bin/ restart 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

keycloak 配置

1.创建realm

realm相当于是一家公司了,不同的realm不受影响,做到了租户隔离了。
在这里插入图片描述

设置realm的名称为 test,后面oauth 是要用到的
在这里插入图片描述

切换realm,默认情况下,是在Master 这个下面,可以切换到新建立的realm里
在这里插入图片描述

2. 创建client

1.点击Clients菜单
2.点击Create按钮
在这里插入图片描述

3.设置Client Id (为应用的名称)
4.点击保存,创建gerrit 客户端成功
在这里插入图片描述

3. 设置oauth( 没有这个特殊的设置)

1.点击菜单Clients
2.列表中,找到创建的gerrit 客户端,并点击【Edit】,进入gerrit客户端的编辑
在这里插入图片描述

新版本的KeyCloak ,默认是没有【Credentials】的tab选项的。需要修改Access Type
需要配置Client Protocolopenid-connectAccess Typeconfidential ,然后点击保存,就出来了
在这里插入图片描述
保存以后,【Credentials】的tab选项就出来了
在这里插入图片描述

4.并配置redirect url

配置【Valid Redirect URIs 】地址为 gerrit的地址加oauth ,【http://172.16.161.131:8085/oauth】和【http://172.16.161.131:8085/】,不然就会登录失败,未授权。

在这里插入图片描述

5. 创建用户

这个用户是realm级别的,而不是应用级别的。
在这里插入图片描述
添加用户信息,(密码得单独设置),对于这个gerrit 必须把邮箱,First Name ,LastName ,Username 四个参数,必须都设置上, gerrit 会根用 FisrtName + LastName 拼接为用户名称,邮箱会作为gerrit的必须参数。
在这里插入图片描述

创建用户的话,设置用户名密码,
在这里插入图片描述

这样就创建了一个admin 用户了
在这里插入图片描述

6. 获取secret

点击【Credentials】,查看Secret的密码信息。
在这里插入图片描述

gerrit 配置

修改 etc/ 配置 ,logoutUrl 登出之后,跳转地址,

[auth]
        type = OAUTH
        gitBasicAuthPolicy = HTTP
        logoutUrl = http://172.16.161.131:8084/auth/realms/test/protocol/openid-connect/logout?redirect_uri=http://172.16.161.131:8085/
        
[plugin "gerrit-oauth-provider-keycloak-oauth"]
        root-url = http://172.16.161.131:8084
        realm = test
        client-id = gerrit
        client-secret = 86y03fXxiZ7NKzPa6Dfkvg3fDjTmHUyw
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

完整配置如下

[gerrit]
        basePath = git
        canonicalWebUrl = http://172.16.161.131:8085/
        serverId = 1c02d061-9636-48bc-b49b-d5ea4f0f0c6d
[container]
        javaOptions = "-Dflogger.backend_factory=.log4j.Log4jBackendFactory#getInstance"
        javaOptions = "-Dflogger.logging_context=#getInstance"
        user = root
        javaHome = /usr/local/jdk1.8.0_241/jre
[index]
        type = LUCENE
[auth]
        type = OAUTH
        gitBasicAuthPolicy = HTTP
        logoutUrl = http://172.16.161.131:8084/auth/realms/test/protocol/openid-connect/logout?redirect_uri=http://172.16.161.131:8085/
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = localhost
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://*:8085/
[cache]
        directory = cache

[plugin "gerrit-oauth-provider-keycloak-oauth"]
        root-url = http://172.16.161.131:8084
        realm = test
        client-id = gerrit
        client-secret = 86y03fXxiZ7NKzPa6Dfkvg3fDjTmHUyw


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

配置完事后,重启gerrit服务,生效

#重启gerrit 
./bin/ restart 
  • 1
  • 2

登录测试

下图可以看到,登录测试,可以正常的登录到gerrit服务上, 美滋滋啊
在这里插入图片描述

常见问题

1. OAuth service provider wasn’t installed

错误详细信息如下,导致问题的原因是由于没有安装oauth插件导致的

Caused by: javax.servlet.ServletException: OAuth service provider wasn't installed
        at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.pickSSOServiceProvider(OAuthWebFilter.java:180)
        at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.init(OAuthWebFilter.java:74)
        at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:110)
        at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98)
        at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:232)
        at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:136)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以去oauth官网 : /davido/gerrit-oauth-provider/ 下载对应版本的 包,我这边是gerrit-3.0. 版本的,所以下载的是 v3.0.0的。

#进入插件目录
cd plugins

#下载插件,然后重启gerrit即可
wget //davido/gerrit-oauth-provider/releases/download/v3.0.0/
  • 1
  • 2
  • 3
  • 4
  • 5

2. Invalid parameter: redirect_uri

导致的原因,是配置【* Valid Redirect URIs 】有问题
在这里插入图片描述
修改以一下客户端的【* Valid Redirect URIs 】 为gerrit 的地址【http://172.16.161.131:8085/oauth】
在这里插入图片描述

3. Response doesn’t contain email field

出现下面这个问题的原因,是创建用户的时候,没有添加邮箱,导致gerrit用户需要关联邮箱,关联是失败。

2022-09-30 10:40:54,133] [HTTP-108] WARN  org.eclipse.jetty.server.HttpChannel : /oauth java.io.IOException: Response doesn't contain email field
[2022-09-30 10:40:54,136] [HTTP-108] ERROR com.google.gerrit.pgm.http.jetty.HiddenErrorHandler : Error in GET /oauth?state=XM8ESw3uCvQ9h8_pNl8ufKUToJ4LxRl8a4rNe76DI_k&session_state=3bd2e5df-9afb-4a59-9960-0e7c9acfad6a&code=a0d44146-8007-4bd7-bf93-1dda445a01f2.3bd2e5df-9afb-4a59-9960-0e7c9acfad6a.d32ae9c8-d5d3-4fa3-8543-766f805cb202
java.io.IOException: Response doesn't contain email field
        at com.googlesource.gerrit.plugins.oauth.KeycloakOAuthService.getUserInfo(KeycloakOAuthService.java:100)
        at com.google.gerrit.httpd.auth.oauth.OAuthSession.login(OAuthSession.java:105)
        at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.doFilter(OAuthWebFilter.java:105)
        at com.google.gerrit.httpd.RunAsFilter.doFilter(RunAsFilter.java:120)
        at com.google.gerrit.httpd.AllRequestFilter$FilterProxy$1.doFilter(AllRequestFilter.java:133)
        at com.google.gerrit.httpd.AllRequestFilter$FilterProxy.doFilter(AllRequestFilter.java:135)
        at com.google.gerrit.httpd.RequestMetricsFilter.doFilter(RequestMetricsFilter.java:57)
        at com.google.gerrit.httpd.RequestContextFilter.doFilter(RequestContextFilter.java:69)
        at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:121)
        at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

参考文章

/davido/keycloak-gerrit-oauth-provider/blob/master/resources/
https:///article/